2012-06-04 5 views
7

Ich habe dieses Problem, bei dem der GCC-Compiler zu versagen scheint, wenn es darum geht, zwei Objektdateien zu verbinden, die ich zusammen habe. Beide Objektdateien foo1.cc und foo2.cc enthalten Klassen aus einer Header-Datei namens foo1.hh. Außerdem hat die Header-Datei foo.hh als externe Deklaration eine Objektinstanz, die in foo1.cc erscheint.Wie kompilieren und verknüpfen Sie Objektdateien in C++ mit der gleichen Header-Datei?

Es sollte beachtet werden, dass die Header-Datei foo.hh nur einmal zwischen den beiden Quelldateien foo1.cc und definiert wird.

Wenn ich die Quelldateien mit dem folgenden Befehl kompilieren, alles scheint zu funktionieren:

g++ foo1.cc foo2.cc 

Der obige Befehl eine ausführbare a.out genannt produzieren wird.

Wenn ich versuche, die Quelldateien in Objekt zu kompilieren Dateien unabhängig:

g++ -c foo1.cc 
g++ -c foo2.cc 
g++ -o foo1.o foo2.o 

Der GCC Compiler beschwert, dass es nicht definierte Verweise auf Funktionen in foo2.cc sind. Diese Funktionen sollten in foo1.cc definiert werden; der Linker erkennt das jedoch nicht.

Ich fragte mich, ob es eine Möglichkeit gäbe, dieses Problem mit dem GCC-Compiler zu umgehen.

+0

Willkommen zu SO! Achten Sie darauf, die hilfreichste Antwort zu akzeptieren. – jncraton

+0

sollten Sie eine Antwort akzeptieren. – Walter

Antwort

8

Es gibt kein Problem, Sie haben einen Fehler in Ihrer GCC-Syntax.

g++ -c foo1.cc 
g++ -c foo2.cc 
g++ -o foo foo1.o foo2.o 

der -o Parameter akzeptiert den Namen der Ausgabedatei, so in Ihrem Fall wäre es foo1.o mit Ergebnis der Verknüpfung überschreiben.

3

Ihr letzter Befehl, der der Verknüpfungsbefehl ist, sagt: Erstellen Sie eine ausführbare Datei aus foo2.o und benennen Sie die ausführbare Datei foo1.o. Der Linker wird wahrscheinlich nicht alle Informationen finden, die er zum Erstellen der ausführbaren Datei benötigt, da Sie sowohl foo1.o als auch foo2.o verwenden wollten. Lassen Sie einfach die -o Flagge zusammen weg:

g++ foo1.o foo2.o 
Verwandte Themen