C++ 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 但要

我正试图用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
但要继续:

    $ 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;