Was ist der Unterschied zwischen g++ und gcc? Welche davon sollte für die allgemeine C++-Entwicklung verwendet werden?
Was ist der Unterschied zwischen g++ und gcc?
Brian R. Bondy
gcc
und g++
sind Compiler-Treiber des GNU Compilers Sammlung (was einst nur GNU war C-Compiler).
Obwohl sie automatisch bestimmen, welche Backends (cc1
cc1plus
…) je nach Dateityp aufzurufen, sofern nicht mit überschrieben -x language
sie haben einige Unterschiede.
Der wahrscheinlich wichtigste Unterschied in ihren Standardeinstellungen besteht darin, mit welchen Bibliotheken sie automatisch verknüpfen.
Laut der Online-Dokumentation von GCC Link-Optionen und wie g++ aufgerufen wird, g++
ist äquivalent zu gcc -xc++ -lstdc++ -shared-libgcc
(Die erste ist eine Compiler-Option, die beiden zweiten sind Linker-Optionen). Dies kann überprüft werden, indem beide mit ausgeführt werden -v
Option (sie zeigt die ausgeführten Backend-Toolchain-Befehle an).
-
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 ++ in Linux? Sollten wir nicht nur eine Binärdatei und einen Symlink (oder so ähnlich) haben?
– UchihaItachi-Inaktives-Konto
17. Juli 2019 um 14:32 Uhr
-
@Uchihaltachi Diese Dateien sind feste Links und werden beim Hochfahren überprüft
argv[0]
um zu sehen, welcher Aufruf verwendet werden soll. Dies ist bei den wichtigsten UNIX-Dienstprogrammen ziemlich üblich.– Benutzer836218
12. November 2019 um 18:55 Uhr
-
Wo steht das
g++ is equivalent to gcc -xc++ -lstdc++ -shared-libgcc
in den Unterlagen? Es sagt nur, dass es .c, .h und .i als C++ behandelt und libstdc++ automatisch verlinkt. Wenn der gepostete Befehl der Fall wäre, würde eine .txt-Datei mit gültigem C++-Code kompiliert, aber stattdessen einen nicht unterstützten Dateiformatfehler zurückgeben.– SD
14. September 2020 um 3:37 Uhr
-
-
Martin York
GCC: GNU-Compiler-Sammlung
- Verweise auf alle verschiedenen Sprachen, die vom GNU-Compiler unterstützt werden.
gcc
: GNU-C-Compiler
g++
: GNU-C++-Compiler
Die Hauptunterschiede:
gcc
wird kompilieren:*.c\*.cpp
Dateien als C bzw. C++.g++
wird kompilieren:*.c\*.cpp
Dateien, aber sie werden alle als C++-Dateien behandelt.- Auch wenn Sie verwenden
g++
Um die Objektdateien zu verknüpfen, verknüpft es automatisch in den std C++-Bibliotheken (gcc
tut dies nicht). gcc
Das Kompilieren von C-Dateien hat weniger vordefinierte Makros.gcc
kompilieren*.cpp
undg++
kompilieren*.c\*.cpp
Dateien hat ein paar zusätzliche Makros.
Zusätzliche Makros beim Kompilieren *.cpp
Dateien:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
-
Sie können die std C++-Bibliothek einbinden
gcc
durch Passieren-lstdc++
Parameter.– Denilson Sá Maia
23. August 2010 um 0:13 Uhr
-
Es gibt also mehr Unterschiede zwischen ‘gcc’ und ‘g++’ als nur die Standardbibliotheken
gcc -lstdc++
erhalten Sie immer noch nicht das gleiche Verhalten wieg++
. Wir haben all dieses sprachspezifische Verhalten aus einem bestimmten Grund in einen eigenen Treiber gepackt, dafür ist er da. 🙂– Ti Strga
28. Januar 2013 um 21:03 Uhr
-
In meinem Kommentar geht es nicht nur um das Verlinken … das ist der Punkt. Beschränken Sie die Diskussion auch nur auf das Verlinken (was Ihre Antwort nicht war) eines Benutzers still nicht die gesamte C++-Standardbibliothek verwenden können, indem Sie nur angeben
-lstdc++
, da Abhängigkeiten von mathematischen, RTTI- und Ausnahmeinformationen fehlen. Ob ein bestimmter Testfall verknüpft wird oder fehlschlägt, hängt vom Betriebssystem ab und welche C++-Features vom Testfall verwendet werden, weshalb all dieses Wissen wieder in den g++-Treiber integriert ist, anstatt es dem Benutzer zu überlassen, es herauszufinden .– Ti Strga
29. Januar 2013 um 15:38 Uhr
-
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++-Linkstufe macht viel mehr als
gcc -lstdc++
auf anderen Betriebssystemen, insbesondere wenn das Ziel eine eingebettete Plattform ist. Glücklicherweise versenden wir deshalb überhaupt ein g++.– Ti Strga
29. Januar 2013 um 15:40 Uhr
-
Die Spezifikationszeichenfolgen sind so konstruiert, dass sie für den Compiler spezifisch sind, die wiederum spezifisch für das Betriebssystem und das Ziel sind. Also wenn du rennst
-dumpspec
Auf (zum Beispiel) einem Cross-Compiler, der auf ein eingebettetes System abzielt, werden Sie die Unterschiede sehen. Es gibt mehr als nur Linker-Unterschiede … worum es auch bei 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 damit vertraut bin, was die Frontends sind und was nicht.– Ti Strga
29. Januar 2013 um 17:02 Uhr
Für c++ sollten Sie g++ verwenden.
Es ist derselbe Compiler (zB die GNU-Compiler-Sammlung). GCC oder G++ wählen einfach ein anderes Frontend mit anderen Standardoptionen.
Kurz gesagt: Wenn Sie g++ verwenden, teilt das Frontend dem Linker mit, dass Sie möglicherweise mit den C++-Standardbibliotheken verknüpfen möchten. Das gcc-Frontend wird das nicht tun (es könnte auch mit ihnen verknüpfen, wenn Sie die richtigen Befehlszeilenoptionen übergeben).
-
+1 Auch meine GNU/Linux gcc-Manpage sagt: “Wenn Sie C++-Programme kompilieren, sollten Sie stattdessen GCC als g++ aufrufen.”
– Elliptische Ansicht
23. Oktober 2018 um 0:54 Uhr
l – marc l
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 gcc
kann sich im Zusammenhang mit der C-Programmierung manchmal immer noch auf den “GNU C Compiler” beziehen.
man gcc
# GCC(1) GNU
#
# NAME
# gcc - GNU project C and C++ compiler
Aber, g++
ist der C++ Compiler für die GNU Compiler Collection. Wie gnat
ist der Ada-Compiler für gcc
. siehe Verwendung der GNU Compiler Collection (GCC)
Zum Beispiel Ubuntu 16.04 und 18.04 man g++
Befehl gibt die zurück GCC(1)
Handbuchseite.
Ubuntu 16.04 und 18.04 man gcc
besagt, dass …
g++
akzeptiert meist die gleichen Optionen wiegcc
und dass die Vorgabe …
… Gebrauch 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, es sei denn, -x wird verwendet. Dieses Programm ist auch nützlich, wenn Sie eine C-Header-Datei mit der Erweiterung .h zur Verwendung in C++-Kompilierungen vorkompilieren.
Suche das gcc
man-Seiten für weitere Details zu den Optionsvarianzen zwischen gcc
und g++
.
Welches sollte für die allgemeine C++-Entwicklung verwendet werden?
Technisch auch nicht gcc
oder g++
kann für die allgemeine C++-Entwicklung mit entsprechenden Optionseinstellungen verwendet werden. Allerdings ist die g++
Das Standardverhalten ist natürlich auf eine C++-Entwicklung ausgerichtet.
Die Ubuntu 18.04 „gcc“-Manpage hinzugefügt, und Ubuntu 20.04 weiterhin folgenden Absatz:
Der übliche Weg, GCC auszuführen, besteht darin, die aufgerufene ausführbare Datei auszuführen
gcc
odermachine-gcc
beim Cross-Kompilieren, bzwmachine-gcc-version
um eine bestimmte Version von GCC auszuführen. Wenn Sie C++-Programme kompilieren, sollten Sie GCC als aufrufeng++
stattdessen.
Nebenbemerkung: Im Fall der eingebetteten Xcode.app-Toolchain g++
einfach verlinkt gcc
. Daher, g++
Aufrufe können je nach Toolchain variieren.
ls -l /Applications/Xcode.app/Contents/Developer/usr/bin
# …
# lrwxr-xr-x 1 root wheel 3 Apr 27 2021 g++ -> gcc
# -rwxr-xr-x 1 root wheel 167120 Nov 23 20:51 gcc
### -- versus --
which -a g++
# /usr/bin/g++
ls -l /usr/bin/g++
# -rwxr-xr-x 1 root wheel 137616 Jan 1 2020 /usr/bin/g++
njsf
Ein bemerkenswerter Unterschied besteht darin, dass, wenn Sie a bestehen .c
Datei in gcc wird es als C kompiliert.
Das Standardverhalten von g++ ist zu behandeln .c
Dateien als C++ (es sei denn -x c
angegeben).
-
(Spät, aber für die Nachwelt) Wie andere Antworten betont haben, ist dies keineswegs “der einzige bemerkenswerte Unterschied”, es sei denn, der Leser hat eine verzerrte Definition von Bemerkenswertheit.
– Unterstrich_d
13. September 2015 um 21:54 Uhr
zaphod
Obwohl die Befehle gcc und g++ sehr ähnliche Dinge tun, ist g++ als Befehl konzipiert, den Sie aufrufen würden, um ein C++-Programm zu kompilieren; 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 wird. Beide sind in der Lage, mit der C++-Standardbibliothek zu verknüpfen, aber nur g++ tut dies standardmäßig. Wenn Sie also ein in C++ geschriebenes Programm haben, das nicht gegen die Standardbibliothek gelinkt werden muss, wird gcc zufällig das Richtige tun; aber g++ würde es auch tun. Es gibt also wirklich keinen Grund, g++ nicht für die allgemeine C++-Entwicklung zu verwenden.
-
(Spät, aber für die Nachwelt) Wie andere Antworten betont haben, ist dies keineswegs “der einzige bemerkenswerte Unterschied”, es sei denn, der Leser hat eine verzerrte Definition von Bemerkenswertheit.
– Unterstrich_d
13. September 2015 um 21:54 Uhr
oho
Ich begann mich für das Thema zu interessieren und führte einige Experimente durch
-
Ich habe diese Beschreibung gefunden Hieraber es ist sehr kurz.
-
Dann habe ich versucht, mit gcc.exe und g++.exe auf meinem Windows-Rechner 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 den richtigen Erweiterungen, die für die Sprache geeignet sind
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 dies 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 für andere Tools sind, die in meiner Umgebung sind: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
-
gcc funktioniert gut als Metatool, wenn Sie die richtige Erweiterung haben oder die richtigen -std -x-Flags setzen. Sehen Das