2009-06-16 3 views
24

Hallo alle: schnelle Frage: Ich bin in einer Situation, in der es sinnvoll wäre, meine C++ - Programmdatei nur mit 'gcc' (ohne g ++) zu generieren. Der Grund dafür ist, dass ich den Code an einen Server für automatische Übermittlung senden muss, der den Befehl "g ++" (oder "C++") nicht erkennt.Verknüpfen von C++ - Code mit 'gcc' (ohne g ++)

In meinen Experimenten, während ich bin Kompilierung gcc funktioniert gut. Problem ist, wenn ich versuche, die generierten Objektdateien zu verknüpfen, wird es durcheinander gebracht. Nun, basierend auf dem, was ich von der gcc man-Seite verstehe (ich bin vielleicht weit weg, also sag mir, wenn ich es bin), ist g ++ im Grunde genommen gcc, aber es verbindet die C++ - Bibliothek.

Wenn das stimmt, wie kann ich (wenn möglich) explizit die C++ - Bibliothek ohne mit dem Befehl g ++ (oder C++) verknüpfen?

EDIT: ich hinzufüge, die Make-Datei das Problem besser zu veranschaulichen:

COMPILER = gcc 
CFLAGS = -Wall -g -x c++ 

# MODULE COMPILATION 
model: modules/model.h modules/sources/model.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/model.cpp -o obj/model.o 

algorithms: modules/algorithms.h modules/sources/algorithms.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/algorithms.cpp -o obj/algorithms.o 

io: modules/io.h modules/sources/io.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/io.cpp -o obj/io.o 

stopwatch: modules/stopwatch.h modules/sources/stopwatch.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/stopwatch.cpp -o obj/stopwatch.o 

# EXECUTABLE GENERATION 
exe: model algorithms io stopwatch 
    $(COMPILER) $(CFLAGS) main.cpp obj/model.o obj/algorithms.o obj/io.o obj/stopwatch.o -o bin/process 

# DEFAULT TEST CASE 
run: exe 
    ./bin/process -i data/nasa_small.log -a data/nasa_small.access -s data/nasa_small.stack 

# CLEANING ROUTINE 
clean: 
    rm -f obj/* 
+0

gcc und g ++ zeigen buchstäblich auf die gleiche ausführbare Datei. Der einzige Unterschied sind die Flags, die an das Backend übergeben werden. –

+0

Korrigieren Sie den automatischen Übermittlungsserver! –

+0

War keine Option = D –

Antwort

41

Sie können die Standard-C-Verbindung ++ Bibliothek mit dem -l Flag gcc:

gcc cplusplus.o -lstdc++ -o myexe 
+0

Das funktioniert gut, ich kannte den Namen der Bibliothek nicht, um es zu verknüpfen. –

+0

Ich benutze diese Technik seit Jahren erfolgreich. Aber ich habe gerade auf Ubuntu 11.10 (gcc 4.6.1) aktualisiert und es funktioniert nicht mehr. Ich bekomme jetzt einen "undefinierten Verweis auf den Operator" operator new (unsigned long) "auf mehreren Rechnern. Hat sich dieses Problem für jemand anderen ergeben? – mgiuca

+1

Oh, macht nichts. Es liegt daran, dass ich -lstdC++ vor die O-Datei gestellt habe. Neuere Versionen von GCC erfordern, dass Sie Bibliotheken nach den O-Dateien einfügen. – mgiuca

13

Wenn Sie Führen Sie g ++ mit der Option "-v" aus, es zeigt an, welcher Befehl und welche Optionen verwendet werden. Sie sollten in der Lage sein, die korrekte gcc-Befehlszeile von dort abzuleiten.

+0

Auch eine gute Lösung! –