2009-08-24 19 views
1

Ich habe eine Mischung aus C und C++ - Dateien kompilieren unter g ++. Wie in: What is the difference between g++ and gcc?Migrieren von g ++ zu gcc

Die c-Dateien werden als C++ mit der g ++ - Befehlszeile kompiliert. Kein großes Problem, aber die Migration auf gcc ermöglicht es, dass die c-Dateien als c-Dateien kompiliert werden und die C++ - Datei als C++ kompiliert wird.

Was -I includes oder -L Bibliotheken muss ich zur gcc-Befehlszeile hinzufügen, die die g ++ - Befehlszeile standardmäßig enthält?

Antwort

1

Sie sollten nicht müssen irgendwelche hinzufügen. Wenn es C++ verwendet, sollte es automatisch C++ - Bibliotheken einbringen.

Wenn nicht, willst du -lstdC++ (und wenn du immer noch undefinierte Referenzen bekommst, -lc für die libc). Vergiss nicht -lm, wenn du mathematische Funktionen verwendest.

+1

Erforderlich zum Einschließen von -lstdC++ für den Linker-Befehl. – simon

4

Sie sollten keine weiteren Includes oder Bibliotheken hinzufügen müssen, als Sie bereits haben.

Was für C-Funktionen aufgerufen werden aus C++ - Code - Sie müssen dem C++ - Compiler sagen, dass dies C-Funktionen sind, so dass das Programm korrekt verknüpft ist und funktioniert.

Die gängige Praxis ist, die folgenden Richtlinien auf alle Ihre C Header hinzufügen in C++ Dateien enthalten sind:

#ifdef __cplusplus 
extern "C" { 
#endif 

... C header contents go here ... 

#ifdef __cplusplus 
} 
#endif 

Mehr Infos hier: http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

+4

Erforderlich zum Einschließen von -lstdC++ für den Linker-Befehl. – simon

0

Warum die c Objekte mit gcc nicht kompilieren und die C++ mit g ++ und dann, wenn Sie verknüpfen, verknüpfen Sie mit dem g ++?

+0

könnte ich wahrscheinlich, aber ich hatte ein ziemlich kompliziertes existierendes Makefile mit Quelle von einer dritten Partei, die ich nicht mit Affe haben wollte. – simon

1

GCC kann basierend auf der Dateierweiterung bestimmen, in welcher Sprache sich eine Datei befindet. Allerdings ist GCC Link nicht automatisch zur Laufzeit Unterstützung für jede andere Sprache als C. In der Praxis bedeutet das können Sie C++ Programme mit gcc statt g++ kompilieren, aber Sie werden die -lstdc++ Richtlinie hinzufügen müssen:

#include <iostream> 

int main() 
{ 
    std::cout << "Hello world\n"; 
} 

g++ hello.cc

gcc hello.cc -lstdc++

genauer gesagt, müssen Sie -lstdc++ angeben, wenn Sie Sie die Standard-Bibliothek verwenden, Ausnahmen, Operator new oder RTTI. Zum Beispiel versucht, nach dem ohne -lstdc++ Kompilieren:

int main() 
{ 
    try { 
     throw 1; 
    } 
    catch (int i) 
    { 
     return i; 
    } 
} 

Bitte beachten Sie, dass STL-Container (einschließlich std::string s) verwendet Operator new standardmäßig. Genau genommen sollten Sie in der Lage sein, die Algorithmen (std::min, std::find_first_of, usw.) Binder und einige andere Dinge in der Standardbibliothek ohne -lstdc++ zu verwenden, aber Sie können es auch gut einbinden (der Linker ignoriert alle Bibliotheken, die Sie verwenden eigentlich nicht verlinken).

+0

Das macht Sinn.Da Sie die C++ - Standardbibliothek (std :: cout) verwenden, sollten Sie sie offensichtlich in die Befehlszeile aufnehmen. Die eigentliche Frage ist, warum Sie die C++ - Standardbibliothek in reinem alten C verwenden? –

+0

@Gerco Dries: C und C++ haben immer noch Int Haupt. Was versuchst du in deinem Kommentar zu sagen? –

+0

@Greco, Sie werden feststellen, dass der letzte Satz der Frage lautet "Was -I enthält oder -L Bibliotheken muss ich hinzufügen, um die GCC-Befehlszeile, die die g ++ - Befehlszeile standardmäßig enthält?" was ich verstanden habe, "wenn ich C++ Code habe und ich es mit GCC kompilieren will, welche Schalter muss ich übergeben, damit das funktioniert?" Also, ja, beide Programmschnipsel sind C++ - Snippets, und um sie mit GCC zu kompilieren, müsste der Befehlszeilenschalter -lstdC++ hinzugefügt werden. –