2012-04-01 31 views
0

我试图解决的问题与makefile文件。生成文件:符号(S)未找到架构

我有一个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 

以下是文件
的main.cpp

#include <iostream> 
#include <string.h> 
#include "Log.hpp" 

int main(int argc, char *argv[]) { 
    Log::setFile("output.log"); 
    Log(Log::LEVEL_INF) << "out and up..."; 
    Log::setLevel(Log::LEVEL_INF); 
    Log(Log::LEVEL_INF) << "another line"; 
    Log(Log::LEVEL_ERR) << "now a number: " << 13; 
    Log(Log::LEVEL_DBG) << "I shall not pass"; 
    return 0; 
} 

Log.hpp

#ifndef log_Log_hpp 
#define log_Log_hpp 
#include <string.h> 

class Log{ 
    private: 
     static std::string fileName; 
     static int overallVerboseLvl; 
     int messageVerboseLvl; 
    public: 
    static const int LEVEL_INF; 
    static const int LEVEL_ERR; 
    static const int LEVEL_DBG; 

    Log(int verboseLvl); 
    Log(); 
    ~Log(); 
    std::ostream& operator<<(char const*); 
    static void setFile(std::string file); 
    static void setLevel(int level); 

}; 


#endif 

Log.cpp

#include <iostream> 
#include <string.h> 
#include "Log.hpp" 

const int Log::LEVEL_INF = 0; 
const int Log::LEVEL_ERR = 1; 
const int Log::LEVEL_DBG = 2; 

void Log::setLevel(int level){ 
    Log::overallVerboseLvl = level; 
} 

void Log::setFile(std::string fileName){ 
    Log::fileName = fileName; 
} 

Log::Log(){ 
    Log::fileName = ""; 
    Log::overallVerboseLvl = Log::LEVEL_DBG; 
} 

Log::Log(int verboseLvl){ 
    Log::fileName = ""; 
    Log::messageVerboseLvl = verboseLvl; 
} 

std::ostream& Log::operator<<(char const* text){ 
    if (Log::overallVerboseLvl >= Log::messageVerboseLvl) { 
     std::cout << text; 
    }  
    return std::cout; 
} 

我在做什么错?

+1

您能告诉我们您的源文件吗? – templatetypedef 2012-04-01 22:29:17

+0

我注意到在错误输出中提到的文件'Log.o'。这也在你的makefile中吗? – thb 2012-04-01 22:31:11

+1

是否有一个名为Log.cpp的文件?你在同一个目录下有两个makefile吗? – gbulmer 2012-04-01 22:31:32

回答

5

您还没有定义的析构函数或丢失的静态变量。添加其中之一:

Log::~Log() { 
} 

静态变量部分是一种不直观的。您已经声明了它们,但尚未定义它们。你可以这样想 - 编译器知道的是你想能够使用这些变量。但是说你包括Log.h 100次。您不希望编译器创建相同变量的100个副本。所以你必须给它一个地方来实际实例化它们。在您的Log.cpp文件中,执行以下操作:

// Note, no 'static' keyword needed (or allowed). 
std::string Log::fileName; 
int Log::overallVerboseLvl; 
3

有一个干净的目标,运行make clean命令,然后尝试做。我想你可能有不同的操作系统

clean: 
    <TAB> rm *.o 
+0

我做到了这一点,并得到了现在的问题的结果。 – kotoko 2012-04-01 23:15:56

1

您还没有定义的那些东西连接抱怨从先前编译一些.o文件。你已经声明〜Log(),但Log.cpp中没有这种方法。 Similiarly,静态变量filenameoverallVerboseLvl必须Log.cpp定义。

相关问题