GCC vs G++: Was ist der Unterschied und welchen C++-Compiler wählen?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Das Drama mit zwei Namen

\n\n

Wenn 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.

\n\n

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.

\n\n

Kurzer Exkurs: Was ist GCC?

\n\n

GCC (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\n

Der 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.

\n\n

Der Hauptunterschied: Linken der Standardbibliotheken

\n\n

Stellen 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\n

Versuchen wir, es auf zwei Arten zu kompilieren:

\n\n
gcc main.cpp -o programm_gcc\ng++ main.cpp -o programm_gpp\n
\n\n

Ergebnis:

\n
    \n
  • g++ – die Kompilierung wird erfolgreich sein.
  • \n
  • gcc – Sie erhalten einen Linker-Fehler undefined reference to `std::cout'.
  • \n
\n\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.

\n\n

Natürlich können Sie gcc manuell dazu zwingen, mit C++ zu arbeiten, indem Sie das Flag -lstdc++ hinzufügen:

\n\n
gcc main.cpp -lstdc++ -o programm_gcc_fixed\n
\n\n

Aber warum das Rad neu erfinden? g++ erledigt dies „out of the box“.

\n\n

Und was ist mit der Kompilierung von reinem C?

\n\n

Hier 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
    \n
  • Strengere Typüberprüfungen.
  • \n
  • Andere Regeln für implizite Typumwandlungen.
  • \n
  • Mögliche falsche Warnungen (Warnings).
  • \n
\n\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\n

In 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++.

\n\n

Dateierweiterungen: Wie erkennt der Compiler die Sprache?

\n\n

Ein weiterer wichtiger Punkt: gcc und g++ achten auf die Dateierweiterung.

\n\n
    \n
  • .c – wird als C kompiliert.
  • \n
  • .cpp, .cc, .cxx – wird als C++ kompiliert.
  • \n
\n\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

Blogs

Buchempfehlungen