Was ist der Unterschied zwischen g ++ und gcc?

875

Was ist der Unterschied zwischen g ++ und gcc? Welches davon sollte für die allgemeine C ++ - Entwicklung verwendet werden?

Brian R. Bondy
quelle
g ++ => c ++ Compiler gcc => c Compiler
Nagappa

Antworten:

727

gccund g++sind Compiler-Treiber der GNU Compiler Collection (die einst nur der GNU C Compiler war ).

Obwohl sie automatisch bestimmen, welche Backends ( cc1 cc1plus...) je nach Dateityp aufgerufen werden sollen -x language, weisen sie einige Unterschiede auf , sofern sie nicht überschrieben werden .

Der wahrscheinlich wichtigste Unterschied in ihren Standardeinstellungen besteht darin, mit welchen Bibliotheken sie automatisch verknüpfen.

Laut Online - Dokumentation der GCC Link Optionen und wie g ++ aufgerufen , g++entspricht gcc -xc++ -lstdc++ -shared-libgcc(die erste eine Compiler - Option ist, sind die zweiten zwei Linker - Optionen). Dies kann überprüft werden, indem beide mit der -vOption ausgeführt werden (es werden die ausgeführten Backend-Toolchain-Befehle angezeigt).

Kodiologe
quelle
13
Aus dieser Antwort schließe ich, dass der Befehl g ++ effektiv nur gcc mit einer Reihe von Flags ist. Warum gibt es dann zwei verschiedene Binärdateien (von ungefähr derselben Größe) für gcc und g ++ unter Linux? Sollten wir nicht nur einen Binär- und einen Symlink haben (oder etwas in dieser Richtung)?
UchihaItachi
9
@Uchihaltachi Diese Dateien sind feste Links und prüfen beim Booten, argv[0]welcher Aufruf verwendet werden soll. Dies ist unter den UNIX-Kerndienstprogrammen ziemlich häufig.
Relish
438

GCC: GNU Compiler Collection

  • Verweist auf alle verschiedenen Sprachen, die vom GNU-Compiler unterstützt werden.

gcc: GNU C Compiler
g++: GNU C ++ Compiler

Die Hauptunterschiede:

  1. gcckompiliert: *.c\*.cppDateien als C bzw. C ++.
  2. g++wird kompilieren: *.c\*.cppDateien, aber sie werden alle als C ++ - Dateien behandelt.
  3. Auch wenn Sie g++die Objektdateien verknüpfen, werden diese automatisch in den Standard-C ++ - Bibliotheken verknüpft ( gccdies ist nicht der Fall).
  4. gcc Das Kompilieren von C-Dateien enthält weniger vordefinierte Makros.
  5. gccDas Kompilieren *.cppund g++Kompilieren von *.c\*.cppDateien enthält einige zusätzliche Makros.

Zusätzliche Makros beim Kompilieren von *.cppDateien:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Martin York
quelle
37
Sie können die Standard-C ++ - Bibliothek gccdurch Übergabe von -lstdc++Parametern verknüpfen .
Denilson Sá Maia
16
Es gibt mehr Unterschiede zwischen 'gcc' und 'g ++' als nur die Standardbibliotheken, sodass Sie gcc -lstdc++immer noch nicht das gleiche Verhalten wie erhalten g++. Wir haben all dieses sprachspezifische Verhalten aus einem bestimmten Grund in einen eigenen Treiber integriert. Dafür ist es da. :-)
Ti Strga
8
In meinem Kommentar geht es nicht nur um das Verknüpfen ... das ist der Punkt. Auch nur die Diskussion beschränken zu verknüpfen (was Ihre Antwort war nicht), ein Benutzer nach wie vor nicht in der Lage sein , die gesamte C ++ Standard - Bibliothek zu verwenden , indem nur die Angabe -lstdc++, da fehlende Abhängigkeiten von Mathematik, RTTI und Ausnahmeinformationen sein. Ob ein bestimmter Testfall verknüpft ist oder fehlschlägt, hängt vom Betriebssystem ab und davon, welche C ++ - Funktionen vom Testfall verwendet werden. Aus diesem Grund wird all dieses Wissen in den g ++ - Treiber integriert, anstatt es dem Benutzer zu überlassen, dies herauszufinden .
Ti Strga
10
Vertrauen Sie mir, wir haben diese Diskussion oft, normalerweise wenn ein Linux-Benutzer versucht, sein unvollständiges Makefile auf eine andere Plattform zu verschieben. :-) Die g ++ - Link-Phase bietet viel mehr als gcc -lstdc++auf anderen Betriebssystemen, insbesondere wenn das Ziel eine eingebettete Plattform ist. Glücklicherweise versenden wir deshalb in erster Linie ein g ++.
Ti Strga
10
Die Spezifikationszeichenfolgen sind so konstruiert, dass sie spezifisch für den Compiler sind, was wiederum spezifisch für das Betriebssystem und das Ziel ist. Wenn Sie also -dumpspec(zum Beispiel) einen Cross-Compiler ausführen, der auf ein eingebettetes System abzielt, werden Sie die Unterschiede sehen. Es gibt mehr als nur Linker-Unterschiede ... worum es in Ihrer Antwort ging (Präprozessor-Makros, Include-Pfade, mehrere Laufzeitbibliotheken). Wir scheinen aneinander vorbei zu reden, aber als ehemaliger GCC-Betreuer versichere ich Ihnen, dass ich mit den Frontends vertraut bin und was nicht.
Ti Strga
82

Für c ++ sollten Sie g ++ verwenden.

Es ist der gleiche Compiler (z. B. die GNU-Compilersammlung). GCC oder G ++ wählen einfach ein anderes Frontend mit verschiedenen Standardoptionen.

Kurz gesagt: Wenn Sie g ++ verwenden, teilt das Frontend dem Linker mit, dass Sie möglicherweise eine Verknüpfung mit den C ++ - Standardbibliotheken herstellen möchten. Das gcc-Frontend wird das nicht tun (es könnte auch mit ihnen verknüpft werden, wenn Sie die richtigen Befehlszeilenoptionen übergeben).

Nils Pipenbrinck
quelle
3
+1 Auf meiner GNU / Linux-gcc-Manpage heißt es außerdem: "Wenn Sie C ++ - Programme kompilieren, sollten Sie stattdessen GCC als g ++ aufrufen."
Elliptische Ansicht
35

Was ist der Unterschied zwischen g++und gcc?

gcchat sich von einem einsprachigen "GNU C Compiler" zu einer mehrsprachigen "GNU Compiler Collection" entwickelt. Der Begriff "GNU C Compiler" wird manchmal noch im Zusammenhang mit der C-Programmierung verwendet.

Dies g++ ist der C ++ - Compiler für die GNU Compiler Collection. Wie gnatist der Ada-Compiler für gcc. Siehe Verwenden der GNU Compiler Collection (GCC)

Beispielsweise gibt der man g++Befehl Ubuntu 16.04 und 18.04 die GCC(1)Handbuchseite zurück.

Das Ubuntu 16.04 und 18.04 man gccbesagt, dass ...

g++ akzeptiert meist die gleichen Optionen wie gcc

und dass die Standardeinstellung ...

... Verwendung von gccfügt die C ++ - Bibliothek nicht hinzu. g++ist ein Programm, das GCC aufruft und automatisch die Verknüpfung mit der C ++ - Bibliothek angibt. Es behandelt .c-, .h- und .i-Dateien als C ++ - Quelldateien anstelle von C-Quelldateien, sofern nicht -x verwendet wird. Dieses Programm ist auch nützlich, wenn Sie eine C-Header-Datei mit der Erweiterung .h zur Verwendung in C ++ - Kompilierungen vorkompilieren.

Durchsuchen Sie die gccManpages nach weiteren Details zu den Optionsabweichungen zwischen gccund g++.

Welches sollte für die allgemeine C ++ - Entwicklung verwendet werden?

Technisch kann entweder gccoder g++kann für die allgemeine C ++ - Entwicklung mit entsprechenden Optionseinstellungen verwendet werden. Das g++Standardverhalten ist jedoch natürlich auf eine C ++ - Entwicklung ausgerichtet.

Die Ubuntu 18.04-Manpage fügte den folgenden Absatz hinzu:

Die übliche Methode zum Ausführen von GCC besteht darin, die aufgerufene ausführbare Datei gccoder machine-gccbeim Cross-Compilieren machine-gcc-versionauszuführen oder eine bestimmte Version von GCC auszuführen. Wenn Sie C ++ - Programme kompilieren, sollten Sie g++stattdessen GCC as aufrufen .

l - marc l
quelle
21

Ein bemerkenswerter Unterschied besteht darin, dass eine .cDatei, die an gcc übergeben wird, als C kompiliert wird.

Das Standardverhalten von g ++ besteht darin, .cDateien als C ++ zu behandeln (sofern -x cnicht anders angegeben).

njsf
quelle
19
(Spät, aber für die Nachwelt) Wie andere Antworten gezeigt haben, ist dies keineswegs "der einzige bemerkenswerte Unterschied", es sei denn, der Leser hat eine verzerrte Definition von Bemerkbarkeit.
underscore_d
16

Obwohl die Befehle gcc und g ++ sehr ähnliche Aktionen ausführen, ist g ++ der Befehl, den Sie zum Kompilieren eines C ++ - Programms aufrufen würden. Es soll automatisch das Richtige tun.

Hinter den Kulissen sind sie wirklich das gleiche Programm. Soweit ich weiß, entscheiden beide anhand der Dateinamenerweiterung, ob ein Programm als C oder als C ++ kompiliert werden soll. Beide können mit der C ++ - Standardbibliothek verknüpft werden, dies wird jedoch standardmäßig nur von g ++ ausgeführt. Wenn Sie also ein in C ++ geschriebenes Programm haben, das nicht unbedingt mit der Standardbibliothek verknüpft werden muss, wird gcc das Richtige tun. aber dann würde auch g ++. Es gibt also wirklich keinen Grund, g ++ nicht für die allgemeine C ++ - Entwicklung zu verwenden.

Zaphod
quelle
12

Ich interessierte mich für das Thema und führte einige Experimente durch

  1. Ich habe diese Beschreibung hier gefunden , aber sie ist sehr kurz.

  2. Dann habe ich versucht, mit gcc.exe und g ++. Exe auf meinem Windows-Computer zu experimentieren:

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  3. Ich habe versucht, einfache Testdateien für c89, c99 und c ++ 1998 zu kompilieren, und es funktioniert gut für mich mit korrekten Erweiterungen, die für die Sprache übereinstimmen

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. Aber wenn ich versuche, das Tool "gnu compiler collection" auf diese Weise auszuführen:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. Aber dieser funktioniert immer noch ohne Fehler

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. Und das auch

    $ g++ -std=c++0x test_cpp_11.cpp 

ps Testdateien

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

Ergebnisse:

  1. Wenn Sie sich den Prozessbaum ansehen, dann scheint es, dass gcc und g ++ Backend zu anderen Tools sind, die in meiner Umgebung cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe sind

  2. gcc funktioniert gut als Metatool, wenn Sie die richtige Erweiterung haben oder die richtigen -std -x-Flags setzen. Sehen Sie das

Bruziuz
quelle
9

"GCC" ist eine gebräuchliche Abkürzung für die GNU Compiler Collection. Dies ist sowohl der allgemeinste Name für den Compiler als auch der Name, der verwendet wird, wenn der Schwerpunkt auf dem Kompilieren von C-Programmen liegt (da die Abkürzung früher für „GNU C Compiler“ stand).

Wenn Sie sich auf die C ++ - Kompilierung beziehen, ist es üblich, den Compiler "G ++" aufzurufen. Da es nur einen Compiler gibt, ist es auch richtig, ihn "GCC" zu nennen, unabhängig vom Sprachkontext. Der Begriff „G ++“ ist jedoch nützlicher, wenn der Schwerpunkt auf dem Kompilieren von C ++ - Programmen liegt.

Sie könnten mehr lesen hier .

Minh-Triet Pham Tran
quelle
0

Ich habe gcc und g ++ in einem Linux-System getestet. Mit MAKEFILE kann ich den von "GNU make" verwendeten Compliler definieren. Ich habe mit der sogenannten "Dynamic Memory" -Lokalisierungsfunktion von "C plus plus" getestet von:

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

Nur g ++ kann erfolgreich auf meinem Computer kompiliert werden, während gcc einen Fehler meldet

undefined reference to `operator new(unsigned long)'

Meine eigene Schlussfolgerung ist also, dass gcc "C plus plus" nicht vollständig unterstützt. Es scheint, dass die Auswahl von g ++ für C ++ - Quelldateien eine bessere Option ist.

magicmax
quelle
Sie müssen zwei Aufgaben erledigen: 1. Sprache auswählen 2. Bibliothek als libstdc ++
auswählen
-1

gcc und g ++ sind beide GNU-Compiler. Sie kompilieren beide c und c ++. Der Unterschied besteht darin, dass * .c-Dateien von gcc als AC-Programm behandelt werden und G ++ es als AC ++ - Programm betrachtet. * .cpp-Dateien gelten als C ++ - Programme. c ++ ist eine super Menge von c und die Syntax ist strenger. Seien Sie also vorsichtig mit dem Suffix.

Marcus Thornton
quelle
1
C ++ ist eine andere Sprache, keine strikte Obermenge von C, daher kann das Kompilieren mit der falschen Zielsprache zu unerwarteten Ergebnissen führen. Beachten Sie auch, dass dies g++auch .ccals reine C ++ - Dateinamenerweiterung interpretiert wird .
underscore_d