2009-03-26 5 views
4

私のmain.cppファイルにTestClass.cppファイルを明示的にインクルードせずにこの単純なコードをコンパイルすることはできません。私は間違って何をしていますか?前もって感謝します!C++定義されていないリファレンス(インクルードあり)

ここ

コードである:

TestClass.h

#ifndef TESTCLASS_H_ 
#define TESTCLASS_H_ 

class TestClass 
{ 
    public: 
     static int foo(); 
}; 

#endif 

TestClass.cpp

#include "TestClass.h" 

int TestClass::foo() { return 42; } 

main.cppにここ

#include <iostream> 

#include "TestClass.h" 

using namespace std; 

int main() 
{ 
    cout << TestClass::foo() << endl; 

    return 0; 
} 

はエラーである。

g++ main.cpp -o main.app 
/tmp/ccCjOhpy.o: In function `main': 
main.cpp:(.text+0x18e): undefined reference to `TestClass::foo()' 
collect2: ld returned 1 exit status 

答えて

10

コマンドラインにTestClass.cppを含めるので、リンカは関数定義を見つけることができます。

また
g++ main.cpp TestClass.cpp -o main.app 

、自分自身のオブジェクトファイルにそれぞれをコンパイルし、(それを一緒にそれらをリンクするためにコンパイラに伝えますあなたは(foo()の実装がある場合)コンパイルとTestClass.cppに対してリンクしていない

g++ -c main.cpp -o main.o 
g++ -c TestClass.cpp -o TestClass.o 
g++ main.o TestClass.o -o main.app 
+0

どのように奇妙な!私は前にこの問題に遭遇したことはありません。私はC++の初心者です。いつもIDEでこれをやっていたと思います。不思議ではない!ありがとう! –

+1

@Scott - これはコマンドラインで時間を費やす理由です)。それはIDEがあなたから隠していることを明確にします... –

+0

私はファイルの名前を変更することに同意しなければなりません。つまり、ファイルの内容は、内容(関数「main」およびクラス「TestCase」)の場合と同様に、その名前に基づいて名前が付けられます。 – camh

0

)リンカにそれらを転送します。したがって、コンパイラは未定義の関数を使用しようとしていると不平を言っています。

関連する問題