Einleitung: Das Drama mit zwei Namen
\n\nWenn Sie jemals versucht haben, ein C++-Programm unter Linux oder macOS zu kompilieren, sind Sie bestimmt auf zwei ähnliche Befehle gestoßen: gcc und g++. Auf den ersten Blick ist der Unterschied minimal – beide starten einen Compiler, beide können mit C und C++ arbeiten. Aber wenn Sie die falsche Wahl treffen, erhalten Sie einen Berg von Linker-Fehlern, die selbst einem erfahrenen Entwickler den Abend verderben können.
Diese Frage ist eine der beliebtesten auf Stack Overflow (über 200.000 Aufrufe!). Anfänger denken oft: „Wenn gcc C++ kompilieren kann, wozu braucht man dann g++?“ – und das zu Unrecht. Heute klären wir ein für alle Mal anhand realer Codebeispiele, wo der Haken liegt. Sie erfahren, wann Sie gcc und wann g++ verwenden sollten und wie Sie der Falle impliziter Abhängigkeiten entgehen.
Kurzer Exkurs: Was ist GCC?
\n\nGCC (GNU Compiler Collection) ist nicht nur ein Compiler, sondern eine ganze Sammlung von Werkzeugen. Sie enthält Compiler für C, C++, Fortran, Ada und andere Sprachen. Historisch stand die Abkürzung für „GNU C Compiler“, aber im Laufe der Jahre ist das Projekt gewachsen.
\n\nDer Befehl gcc ist ein Treiber, der standardmäßig den Compiler für die Sprache C startet. Der Befehl g++ ist derselbe Treiber, jedoch mit Flags, die die Unterstützung für C++ aktivieren. Scheinbar eine Kleinigkeit. Aber genau diese „Kleinigkeit“ entscheidet darüber, ob Ihr Code funktioniert.
Der Hauptunterschied: Linken der Standardbibliotheken
\n\nStellen Sie sich vor, Sie schreiben ein einfaches C++-Programm:
\n\n#include <iostream>\nint main() {\n std::cout << "Hallo, Welt!" << std::endl;\n return 0;\n}\n\n\nVersuchen wir, es auf zwei Arten zu kompilieren:
\n\ngcc main.cpp -o programm_gcc\ng++ main.cpp -o programm_gpp\n\n\nErgebnis:
\n- \n
g++– die Kompilierung wird erfolgreich sein. \n gcc– Sie erhalten einen Linker-Fehlerundefined reference to `std::cout'. \n
Warum? Weil gcc nicht automatisch die Bibliothek libstdc++ (die C++-Standardbibliothek) einbindet. Es geht davon aus, dass Sie reines C kompilieren, und in C gibt es kein iostream, std::string und andere Annehmlichkeiten von C++. g++ hingegen macht dies automatisch.
Natürlich können Sie gcc manuell dazu zwingen, mit C++ zu arbeiten, indem Sie das Flag -lstdc++ hinzufügen:
gcc main.cpp -lstdc++ -o programm_gcc_fixed\n\n\nAber warum das Rad neu erfinden? g++ erledigt dies „out of the box“.
Und was ist mit der Kompilierung von reinem C?
\n\nHier ist es symmetrisch. Wenn Sie ein C-Programm schreiben und versuchen, es mit g++ zu kompilieren, wird es höchstwahrscheinlich funktionieren. Aber g++ behandelt den Code als C++, was bedeutet:
- \n
- Strengere Typüberprüfungen. \n
- Andere Regeln für implizite Typumwandlungen. \n
- Mögliche falsche Warnungen (Warnings). \n
Beispiel. C-Code:
\n\n#include <stdio.h>\nint main() {\n char *s = malloc(100);\n printf("Hello\\n");\n free(s);\n return 0;\n}\n\n\nIn C ist das in Ordnung. In C++ ist eine explizite Umwandlung (char*)malloc(100) erforderlich. g++ gibt einen Fehler aus, gcc nicht. Fazit: Verwenden Sie für C-Projekte gcc, für C++ g++.
Dateierweiterungen: Wie erkennt der Compiler die Sprache?
\n\nEin weiterer wichtiger Punkt: gcc und g++ achten auf die Dateierweiterung.
- \n
.c– wird als C kompiliert. \n .cpp,.cc,.cxx– wird als C++ kompiliert. \n
Wenn Sie gcc eine Datei mit der Erweiterung .cpp geben, erkennt es, dass es sich um C++ handelt, und verwendet das richtige Frontend (Sprachcompiler). Aber das Linken erfolgt weiterhin ohne