gccund g++sind Compiler-Treiber der GNU Compiler Collection (die einst nur der GNU C Compiler war ).
Obwohl sie automatisch bestimmen, welche Backends ( cc1cc1plus...) 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).
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:
gcckompiliert: *.c\*.cppDateien als C bzw. C ++.
g++wird kompilieren: *.c\*.cppDateien, aber sie werden alle als C ++ - Dateien behandelt.
Auch wenn Sie g++die Objektdateien verknüpfen, werden diese automatisch in den Standard-C ++ - Bibliotheken verknüpft ( gccdies ist nicht der Fall).
gcc Das Kompilieren von C-Dateien enthält weniger vordefinierte Makros.
gccDas Kompilieren *.cppund g++Kompilieren von *.c\*.cppDateien enthält einige zusätzliche Makros.
Zusätzliche Makros beim Kompilieren von *.cppDateien:
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).
+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.
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 ü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 .
(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.
Ich interessierte mich für das Thema und führte einige Experimente durch
Ich habe diese Beschreibung hier gefunden , aber sie ist sehr kurz.
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 20121012by perlmingw.sf.net])4.6.3
$ gcc --version | head -n1
gcc.exe (gcc-4.6.3 release with patches [build 20121012by perlmingw.sf.net])4.6.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
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
gcc funktioniert gut als Metatool, wenn Sie die richtige Erweiterung haben oder die richtigen -std -x-Flags setzen. Sehen Sie das
"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.
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 =newint;* myptr =1;
printf("myptr[0] is %i\n",*myptr);return0;}
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.
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.
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 .
Antworten:
gcc
undg++
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++
entsprichtgcc -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-v
Option ausgeführt werden (es werden die ausgeführten Backend-Toolchain-Befehle angezeigt).quelle
argv[0]
welcher Aufruf verwendet werden soll. Dies ist unter den UNIX-Kerndienstprogrammen ziemlich häufig.GCC: GNU Compiler Collection
gcc
: GNU C Compilerg++
: GNU C ++ CompilerDie Hauptunterschiede:
gcc
kompiliert:*.c\*.cpp
Dateien als C bzw. C ++.g++
wird kompilieren:*.c\*.cpp
Dateien, aber sie werden alle als C ++ - Dateien behandelt.g++
die Objektdateien verknüpfen, werden diese automatisch in den Standard-C ++ - Bibliotheken verknüpft (gcc
dies ist nicht der Fall).gcc
Das Kompilieren von C-Dateien enthält weniger vordefinierte Makros.gcc
Das Kompilieren*.cpp
undg++
Kompilieren von*.c\*.cpp
Dateien enthält einige zusätzliche Makros.Zusätzliche Makros beim Kompilieren von
*.cpp
Dateien:quelle
gcc
durch Übergabe von-lstdc++
Parametern verknüpfen .gcc -lstdc++
immer noch nicht das gleiche Verhalten wie erhalteng++
. Wir haben all dieses sprachspezifische Verhalten aus einem bestimmten Grund in einen eigenen Treiber integriert. Dafür ist es da. :-)-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 .gcc -lstdc++
auf anderen Betriebssystemen, insbesondere wenn das Ziel eine eingebettete Plattform ist. Glücklicherweise versenden wir deshalb in erster Linie ein g ++.-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.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).
quelle
Was ist der Unterschied zwischen
g++
undgcc
?gcc
hat 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. Wiegnat
ist der Ada-Compiler fürgcc
. Siehe Verwenden der GNU Compiler Collection (GCC)Beispielsweise gibt der
man g++
Befehl Ubuntu 16.04 und 18.04 dieGCC(1)
Handbuchseite zurück.Das Ubuntu 16.04 und 18.04
man gcc
besagt, dass ...und dass die Standardeinstellung ...
Durchsuchen Sie die
gcc
Manpages nach weiteren Details zu den Optionsabweichungen zwischengcc
undg++
.Welches sollte für die allgemeine C ++ - Entwicklung verwendet werden?
Technisch kann entweder
gcc
oderg++
kann für die allgemeine C ++ - Entwicklung mit entsprechenden Optionseinstellungen verwendet werden. Dasg++
Standardverhalten ist jedoch natürlich auf eine C ++ - Entwicklung ausgerichtet.Die Ubuntu 18.04-Manpage fügte den folgenden Absatz hinzu:
quelle
Ein bemerkenswerter Unterschied besteht darin, dass eine
.c
Datei, die an gcc übergeben wird, als C kompiliert wird.Das Standardverhalten von g ++ besteht darin,
.c
Dateien als C ++ zu behandeln (sofern-x c
nicht anders angegeben).quelle
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.
quelle
Ich interessierte mich für das Thema und führte einige Experimente durch
Ich habe diese Beschreibung hier gefunden , aber sie ist sehr kurz.
Dann habe ich versucht, mit gcc.exe und g ++. Exe auf meinem Windows-Computer zu experimentieren:
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
Aber wenn ich versuche, das Tool "gnu compiler collection" auf diese Weise auszuführen:
Aber dieser funktioniert immer noch ohne Fehler
Und das auch
ps Testdateien
Ergebnisse:
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
gcc funktioniert gut als Metatool, wenn Sie die richtige Erweiterung haben oder die richtigen -std -x-Flags setzen. Sehen Sie das
quelle
"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 .
quelle
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:
Nur g ++ kann erfolgreich auf meinem Computer kompiliert werden, während gcc einen Fehler meldet
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.
quelle
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.
quelle
g++
auch.cc
als reine C ++ - Dateinamenerweiterung interpretiert wird .