C++ makefile:未找到架构的符号
我正试图用makefile解决一个问题 我有一个main.cpp,然后是addOn.cpp和addOn.hpp。 我只是想做一个简单的makefile来编译这个 我有:C++ makefile:未找到架构的符号,c++,makefile,g++,C++,Makefile,G++,我正试图用makefile解决一个问题 我有一个main.cpp,然后是addOn.cpp和addOn.hpp。 我只是想做一个简单的makefile来编译这个 我有: main: Main.o Log.o g++ -o main Main.o Log.o Main.o: main.cpp Log.hpp g++ -c main.cpp Log.o: Log.cpp Log.hpp g++ -c Log.cpp 但要
main: Main.o Log.o
g++ -o main Main.o Log.o
Main.o: main.cpp Log.hpp
g++ -c main.cpp
Log.o: Log.cpp Log.hpp
g++ -c Log.cpp
但要继续:
$ make
g++ -c main.cpp
g++ -c Log.cpp
g++ -o main Main.o Log.o
Undefined symbols for architecture x86_64:
"Log::~Log()", referenced from:
_main in Main.o
"Log::overallVerboseLvl", referenced from:
Log::setLevel(int) in Log.o
Log::Log() in Log.o
Log::Log() in Log.o
Log::operator<<(char const*)in Log.o
"Log::fileName", referenced from:
Log::setFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)in Log.o
Log::Log(int)in Log.o
Log::Log(int)in Log.o
Log::Log() in Log.o
Log::Log() in Log.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [main] Error 1
$make
g++-c main.cpp
g++-c Log.cpp
g++-o main.o Log.o
架构x86_64的未定义符号:
“日志::~Log()”,引用自:
_主音中的主音
“Log::overallVerboseLvl”,引用自:
Log::Log.o中的setLevel(int)
Log.o中的Log::Log()
Log.o中的Log::Log()
Log::operator有一个干净的目标,运行makeclean命令,然后尝试make。我想您可能有一些以前在不同操作系统上编译的.o文件
clean:
<TAB> rm *.o
clean:
rm*.o
您尚未定义链接器所抱怨的内容。您已经声明了~Log(),但Log.cpp中没有这样的方法。类似地,必须在Log.cpp中定义静态变量filename
和overallVerboseLvl
您尚未定义析构函数或缺少的静态变量。添加以下内容之一:
Log::~Log() {
}
静态变量部分有点不直观。您已经声明了它们,但尚未定义它们。您可以这样想—编译器只知道您希望能够使用这些变量。但是假设您包含Log.h
100次。您不希望编译器创建100个相同变量的副本。所以你必须给它一个地方来实际实例化它们。在Log.cpp
文件中,执行以下操作:
// Note, no 'static' keyword needed (or allowed).
std::string Log::fileName;
int Log::overallVerboseLvl;
您能给我们看一下您的源文件吗?我注意到错误输出中提到了一个文件Log.o
。这也在您的makefile中吗?是否也有一个名为Log.cpp的文件?在同一个目录中有两个makefile吗?我是否正确地收集到命令makemain.o
和makeaddon.o
似乎都正常工作,并且只有makemain
产生错误消息?在addOn.cpp中,您是否提供了~addOn、overallVerboseLvl和filename的实现?我这样做了,得到了现在这个问题上的结果。
clean:
<TAB> rm *.o
Log::~Log() {
}
// Note, no 'static' keyword needed (or allowed).
std::string Log::fileName;
int Log::overallVerboseLvl;