2009-03-26 4 views
4

Je ne peux pas obtenir ce simple morceau de code à compiler sans inclure le fichier TestClass.cpp explicitement dans mon fichier main.cpp. Qu'est-ce que je fais mal? Merci d'avance!C++ Undefined Référence (Même avec Include)

Voici le code:

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

Voici l'erreur:

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 

Répondre

10

Inclure TestClass.cpp dans la ligne de commande, de sorte que l'éditeur de liens peut trouver la définition de fonction:

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

Vous pouvez également compiler chacun leur propre fichier objet, puis dire au compilateur de les relier entre eux (il les transmettra à l'éditeur de liens)

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

Comme c'est étrange! Je n'ai jamais rencontré ce problème auparavant. Je suis nouveau en C++ et je pense que j'ai toujours eu un IDE pour moi. Pas étonnant! Merci! –

+1

@Scott - C'est pourquoi vous devriez passer du temps en ligne de commande;). Cela fait ressortir les choses que l'IDE cache ... –

+0

Je ne suis pas d'accord avec le fait de renommer les fichiers. En l'état, les fichiers sont nommés d'après ce qu'ils contiennent, en cohérence avec le cas du contenu (fonction "main" et classe "TestCase"). – camh

0

Vous n'êtes pas compiler et lier contre TestClass.cpp (où la mise en œuvre de foo() est). Le compilateur se plaint donc que vous essayez d'utiliser une fonction indéfinie.