Was ist der Unterschied zwischen g ++ und gcc? Welches davon sollte für die allgemeine C ++ - Entwicklung verwendet werden?
Was ist der Unterschied zwischen g ++ und gcc? Welches davon sollte für die allgemeine C ++ - Entwicklung verwendet werden?
Antworten:
gcc
und 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 -v
Option ausgeführt werden (es werden die ausgeführten Backend-Toolchain-Befehle angezeigt).
argv[0]
welcher Aufruf verwendet werden soll. Dies ist unter den UNIX-Kerndienstprogrammen ziemlich häufig.
GCC: GNU Compiler Collection
gcc
: GNU C Compiler
g++
: GNU C ++ Compiler
Die 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
und g++
Kompilieren von *.c\*.cpp
Dateien enthält einige zusätzliche Makros.Zusätzliche Makros beim Kompilieren von *.cpp
Dateien:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
durch Übergabe von -lstdc++
Parametern verknüpfen .
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. :-)
-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).
Was ist der Unterschied zwischen g++
und gcc
?
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. Wie gnat
ist 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 gcc
besagt, dass ...
g++
akzeptiert meist die gleichen Optionen wiegcc
und dass die Standardeinstellung ...
... Verwendung von
gcc
fü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 gcc
Manpages nach weiteren Details zu den Optionsabweichungen zwischen gcc
und g++
.
Welches sollte für die allgemeine C ++ - Entwicklung verwendet werden?
Technisch kann entweder gcc
oder 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
gcc
odermachine-gcc
beim Cross-Compilierenmachine-gcc-version
auszuführen oder eine bestimmte Version von GCC auszuführen. Wenn Sie C ++ - Programme kompilieren, sollten Sieg++
stattdessen GCC as aufrufen .
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).
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 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
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
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]
Aber dieser funktioniert immer noch ohne Fehler
$ gcc -x c++ -std=c++98 test_cpp.c
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:
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.
Sie könnten mehr lesen hier .
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.
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.
g++
auch .cc
als reine C ++ - Dateinamenerweiterung interpretiert wird .