2012-04-01 15 views
0

私はmakefileの問題を解決しようとしています。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 

は、ファイルが
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

です

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

+0

エラー出力に「Log.o」というファイルがあります。これはあなたのメイクファイルにもありますか? – thb

+1

Log.cppというファイルもありますか?同じディレクトリに2つのメイクファイルがありますか? – gbulmer

答えて

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コマンドを実行してから、makeを実行してください。私はあなたがリンカが文句を言っているそれらのものを定義していない

clean: 
    <TAB> rm *.o 
+0

私はこれを行い、今質問になっています。 – kotoko

1

異なるオペレーティング・システム上で、以前のコンパイルからいくつかの.oファイルを持っているかもしれないと思います。 〜Log()を宣言しましたが、Log.cppにそのようなメソッドはありません。同様に、静的変数filenameoverallVerboseLvlはLog.cppで定義する必要があります。

関連する問題