gcci g++są sterownikami kompilatora z kolekcji kompilatora GNU (która kiedyś była tylko kompilatorem GNU C ).
Mimo że automatycznie określają, które backendy ( cc1cc1plus...) mają być wywoływane w zależności od typu pliku, o ile nie zostaną zastąpione -x language, mają pewne różnice.
Prawdopodobnie najważniejsza różnica w ustawieniach domyślnych polega na tym, z którymi bibliotekami łączą się automatycznie.
Według internetowych GCC w dokumentacji opcji łącza i jak g ++ jest wywoływana , g++jest równoważna gcc -xc++ -lstdc++ -shared-libgcc(1st jest opcja kompilatora, 2. dwie opcje łącznik). Można to sprawdzić, uruchamiając oba z -vopcją (wyświetla uruchamiane polecenia łańcucha narzędzi zaplecza).
Na podstawie tej odpowiedzi doszedłem do wniosku, że faktycznie polecenie g ++ to po prostu gcc z wieloma flagami. Dlaczego więc istnieją dwa różne pliki binarne (o mniej więcej tym samym rozmiarze) dla gcc i g ++ w systemie Linux? Czy nie powinniśmy mieć tylko jednego pliku binarnego i jednego dowiązania symbolicznego (lub czegoś podobnego)?
UchihaItachi
9
@Uchihaltachi te pliki są twardymi linkami, a po uruchomieniu sprawdzają, argv[0]które wywołanie powinno zostać użyte. Jest to dość powszechne wśród podstawowych narzędzi UNIX.
Delektuj się
438
GCC: Kolekcja kompilatora GNU
Odsyłacze do wszystkich różnych języków obsługiwanych przez kompilator GNU.
gcc: Kompilator g++GNU C: Kompilator GNU C ++
Główne różnice:
gccskompiluje: *.c\*.cpppliki odpowiednio jako C i C ++.
g++skompiluje: *.c\*.cpppliki, ale wszystkie będą traktowane jak pliki C ++.
Również jeśli użyjesz g++do łączenia plików obiektowych, automatycznie łączy się w bibliotekach std C ++ ( gccnie robi tego).
gcc kompilacja plików C ma mniej predefiniowanych makr.
gcckompilowanie *.cppi g++kompilowanie *.c\*.cppplików ma kilka dodatkowych makr.
Możesz połączyć bibliotekę std C ++ gcc, przekazując -lstdc++parametr.
Denilson Sá Maia
16
Istnieje więcej różnic między „gcc” a „g ++” niż tylko bibliotekami standardowymi, więc gcc -lstdc++nadal nie zapewnisz takiego samego zachowania jak g++. Z tego powodu umieściliśmy wszystkie te zachowania specyficzne dla języka we własnym sterowniku. :-)
Ti Strga
8
Mój komentarz nie mówi tylko o łączeniu ... o to chodzi. Nawet po prostu ograniczając dyskusję do linkowania (czego Twoja odpowiedź nie była), użytkownik nadal nie będzie mógł korzystać z całej standardowej biblioteki C ++ tylko poprzez określenie -lstdc++, ponieważ będzie brakowało zależności od matematyki, RTTI i informacji o wyjątkach. To, czy dana skrzynka testowa zostanie połączona, czy nie, będzie zależeć od systemu operacyjnego i od tego, jakie funkcje C ++ są używane przez skrzynkę testową, i znowu dlatego cała ta wiedza jest wbudowana w sterownik g ++, a nie pozostawiona użytkownikowi. .
Ti Strga
10
Zaufaj mi, często prowadzimy tę dyskusję, zwykle gdy użytkownik Linuksa próbuje przenieść swój niekompletny plik Makefile na inną platformę. :-) Etap łącza g ++ robi o wiele więcej niż gcc -lstdc++w innych systemach operacyjnych, szczególnie gdy celem jest platforma osadzona. Na szczęście właśnie dlatego wysyłamy g ++.
Ti Strga
10
Ciągi specyfikacji są zbudowane tak, aby były specyficzne dla kompilatora, które z kolei są specyficzne dla systemu operacyjnego i celu. Jeśli więc uruchomisz -dumpspec(na przykład) kompilator krzyżowy ukierunkowany na system osadzony, zobaczysz różnice. Istnieją nie tylko różnice między linkerami ... i znowu o to ci chodziło (makra preprocesora, zawierają ścieżki, wiele bibliotek wykonawczych). Wygląda na to, że rozmawiamy obok siebie, ale jako były opiekun GCC zapewniam cię, że wiem, jakie są nakładki, a jakie nie.
Ti Strga
82
W przypadku c ++ należy użyć g ++.
To ten sam kompilator (np. Kolekcja kompilatora GNU). GCC lub G ++ wystarczy wybrać inny interfejs z różnymi opcjami domyślnymi.
W skrócie: jeśli używasz g ++, frontend powie linkerowi, że możesz chcieć połączyć się ze standardowymi bibliotekami C ++. Frontend gcc tego nie zrobi (może również połączyć się z nimi, jeśli podasz odpowiednie opcje wiersza poleceń).
+1 Również moja strona podręcznika GNU / Linux gcc mówi: „Kiedy kompilujesz programy C ++, powinieneś wywołać GCC jako g ++”.
Widok eliptyczny
35
Jaka jest różnica między g++i gcc?
gccewoluował z jednego języka „Kompilator GNU C” w wielojęzyczny „Zbiór kompilatorów GNU”. Termin „kompilator GNU C” jest nadal używany czasami w kontekście programowania C.
Na przykład polecenie Ubuntu 16.04 i 18.04 man g++zwraca GCC(1)stronę podręcznika.
Ubuntu 16.04 i 18.04 man gccstwierdza, że ...
g++ akceptuje głównie takie same opcje jak gcc
i że domyślnie ...
... użycie gccnie dodaje biblioteki C ++. g++to program, który wywołuje GCC i automatycznie określa łączenie z biblioteką C ++. Traktuje pliki .c, .h i .i jako pliki źródłowe C ++ zamiast plików źródłowych C, chyba że użyto opcji -x. Ten program jest także przydatny podczas wstępnej kompilacji pliku nagłówka C z rozszerzeniem .h do użycia w kompilacjach C ++.
Przeszukaj strony podręcznika, gccaby uzyskać więcej informacji na temat wariancji opcji między gcci g++.
Którego należy użyć do ogólnego programowania w C ++?
Technicznie, albo gccalbo g++może być użyty do ogólnego programowania w C ++ z odpowiednimi ustawieniami opcji. Jednak g++domyślne zachowanie jest naturalnie dostosowane do rozwoju C ++.
Typowym sposobem uruchomienia GCC jest uruchomienie pliku wykonywalnego o nazwie gcclub machine-gccpodczas kompilacji krzyżowej lub machine-gcc-versionuruchomienie określonej wersji GCC. Kiedy kompilujesz programy C ++, powinieneś wywołać GCC as g++.
(Późno, ale dla potomności). Jak zauważyły inne odpowiedzi, nie jest to w żadnym wypadku „jedyna zauważalna różnica”, chyba że czytelnik ma wypaczoną definicję zauważalności.
underscore_d
16
Chociaż polecenia gcc i g ++ robią bardzo podobne rzeczy, g ++ jest zaprojektowane jako polecenie, które można wywołać w celu skompilowania programu w C ++; jest przeznaczony do automatycznego robienia właściwych rzeczy.
Za kulisami są to naprawdę ten sam program. Jak rozumiem, obaj decydują, czy skompilować program jako C czy jako C ++ na podstawie rozszerzenia nazwy pliku. Oba są w stanie łączyć się ze standardową biblioteką C ++, ale domyślnie robi to tylko g ++. Więc jeśli masz program napisany w C ++, który nie musi się łączyć ze standardową biblioteką, gcc zrobi właściwą rzecz; ale wtedy też g ++. Tak naprawdę nie ma powodu, aby nie używać g ++ do ogólnego programowania w C ++.
Jeśli spojrzymy na drzewo procesów, to wydaje się, że gcc i g ++ to backend do innych narzędzi, które w moim środowisku to: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc działa dobrze jako metatool, jeśli masz poprawne rozszerzenie lub ustawiłeś poprawne flagi -std -x. Zobacz to
„GCC” jest powszechnym terminem określającym kolekcję kompilatorów GNU. Jest to zarówno najbardziej ogólna nazwa kompilatora, jak i nazwa używana, gdy nacisk kładziony jest na kompilowanie programów w C (jak wcześniej skrót oznaczał „GNU C Compiler”).
Odnosząc się do kompilacji w C ++, zwykle nazywa się kompilator „G ++”. Ponieważ istnieje tylko jeden kompilator, można go nazwać „GCC” bez względu na kontekst językowy; termin „G ++” jest jednak bardziej przydatny, gdy nacisk kładziony jest na kompilowanie programów w C ++.
Testowałem gcc i g ++ w systemie linux. Używając MAKEFILE, mogę zdefiniować kompilator używany przez „GNU make”. Testowałem z tak zwaną funkcją lokalizacji „pamięci dynamicznej” „C plus plus” przez:
int main(){int* myptr =newint;* myptr =1;
printf("myptr[0] is %i\n",*myptr);return0;}
Tylko g ++ może pomyślnie skompilować na moim komputerze, podczas gdy gcc zgłasza błąd
undefined reference to `operator new(unsigned long)'
Więc mój wniosek jest taki, że gcc nie obsługuje w pełni „C plus plus”. Wydaje się, że wybranie g ++ dla plików źródłowych C ++ jest lepszą opcją.
Musisz wykonać dwie prace: 1. wybierz język 2. wybierz suhch biblioteki jako libstdc ++
PersianGulf
-1
gcc i g ++ są kompilatorami GNU. Obie kompilują c oraz c ++. Różnica polega na tym, że pliki * .c gcc traktuje to jako program ac, a g ++ traktuje to jako program ac ++. Pliki * .cpp są uważane za programy c ++. c ++ to super zestaw c, a składnia jest bardziej rygorystyczna, więc uważaj na sufiks.
C ++ to inny język, a nie ścisły nadzbiór języka C, więc kompilacja z niewłaściwym językiem docelowym może przynieść nieoczekiwane rezultaty. Zauważ też, że g++będzie to również interpretować .ccjako rozszerzenie pliku tylko do C ++.
Odpowiedzi:
gcc
ig++
są sterownikami kompilatora z kolekcji kompilatora GNU (która kiedyś była tylko kompilatorem GNU C ).Mimo że automatycznie określają, które backendy (
cc1
cc1plus
...) mają być wywoływane w zależności od typu pliku, o ile nie zostaną zastąpione-x language
, mają pewne różnice.Prawdopodobnie najważniejsza różnica w ustawieniach domyślnych polega na tym, z którymi bibliotekami łączą się automatycznie.
Według internetowych GCC w dokumentacji opcji łącza i jak g ++ jest wywoływana ,
g++
jest równoważnagcc -xc++ -lstdc++ -shared-libgcc
(1st jest opcja kompilatora, 2. dwie opcje łącznik). Można to sprawdzić, uruchamiając oba z-v
opcją (wyświetla uruchamiane polecenia łańcucha narzędzi zaplecza).źródło
argv[0]
które wywołanie powinno zostać użyte. Jest to dość powszechne wśród podstawowych narzędzi UNIX.GCC: Kolekcja kompilatora GNU
gcc
: Kompilatorg++
GNU C: Kompilator GNU C ++Główne różnice:
gcc
skompiluje:*.c\*.cpp
pliki odpowiednio jako C i C ++.g++
skompiluje:*.c\*.cpp
pliki, ale wszystkie będą traktowane jak pliki C ++.g++
do łączenia plików obiektowych, automatycznie łączy się w bibliotekach std C ++ (gcc
nie robi tego).gcc
kompilacja plików C ma mniej predefiniowanych makr.gcc
kompilowanie*.cpp
ig++
kompilowanie*.c\*.cpp
plików ma kilka dodatkowych makr.Dodatkowe makra podczas kompilacji
*.cpp
plików:źródło
gcc
, przekazując-lstdc++
parametr.gcc -lstdc++
nadal nie zapewnisz takiego samego zachowania jakg++
. Z tego powodu umieściliśmy wszystkie te zachowania specyficzne dla języka we własnym sterowniku. :-)-lstdc++
, ponieważ będzie brakowało zależności od matematyki, RTTI i informacji o wyjątkach. To, czy dana skrzynka testowa zostanie połączona, czy nie, będzie zależeć od systemu operacyjnego i od tego, jakie funkcje C ++ są używane przez skrzynkę testową, i znowu dlatego cała ta wiedza jest wbudowana w sterownik g ++, a nie pozostawiona użytkownikowi. .gcc -lstdc++
w innych systemach operacyjnych, szczególnie gdy celem jest platforma osadzona. Na szczęście właśnie dlatego wysyłamy g ++.-dumpspec
(na przykład) kompilator krzyżowy ukierunkowany na system osadzony, zobaczysz różnice. Istnieją nie tylko różnice między linkerami ... i znowu o to ci chodziło (makra preprocesora, zawierają ścieżki, wiele bibliotek wykonawczych). Wygląda na to, że rozmawiamy obok siebie, ale jako były opiekun GCC zapewniam cię, że wiem, jakie są nakładki, a jakie nie.W przypadku c ++ należy użyć g ++.
To ten sam kompilator (np. Kolekcja kompilatora GNU). GCC lub G ++ wystarczy wybrać inny interfejs z różnymi opcjami domyślnymi.
W skrócie: jeśli używasz g ++, frontend powie linkerowi, że możesz chcieć połączyć się ze standardowymi bibliotekami C ++. Frontend gcc tego nie zrobi (może również połączyć się z nimi, jeśli podasz odpowiednie opcje wiersza poleceń).
źródło
Jaka jest różnica między
g++
igcc
?gcc
ewoluował z jednego języka „Kompilator GNU C” w wielojęzyczny „Zbiór kompilatorów GNU”. Termin „kompilator GNU C” jest nadal używany czasami w kontekście programowania C.Jest
g++
to kompilator C ++ dla kolekcji kompilatorów GNU. Podobniegnat
jak kompilator Adagcc
. zobacz Korzystanie z kolekcji kompilatora GNU (GCC)Na przykład polecenie Ubuntu 16.04 i 18.04
man g++
zwracaGCC(1)
stronę podręcznika.Ubuntu 16.04 i 18.04
man gcc
stwierdza, że ...i że domyślnie ...
Przeszukaj strony podręcznika,
gcc
aby uzyskać więcej informacji na temat wariancji opcji międzygcc
ig++
.Którego należy użyć do ogólnego programowania w C ++?
Technicznie, albo
gcc
albog++
może być użyty do ogólnego programowania w C ++ z odpowiednimi ustawieniami opcji. Jednakg++
domyślne zachowanie jest naturalnie dostosowane do rozwoju C ++.Stronę Ubuntu 18.04 człowiek dodany następujący akapit:
źródło
Istotną różnicą jest to, że jeśli przekażesz
.c
plik do gcc, skompiluje się jako C.Domyślne zachowanie g ++ polega na traktowaniu
.c
plików jak C ++ (chyba że-x c
podano inaczej ).źródło
Chociaż polecenia gcc i g ++ robią bardzo podobne rzeczy, g ++ jest zaprojektowane jako polecenie, które można wywołać w celu skompilowania programu w C ++; jest przeznaczony do automatycznego robienia właściwych rzeczy.
Za kulisami są to naprawdę ten sam program. Jak rozumiem, obaj decydują, czy skompilować program jako C czy jako C ++ na podstawie rozszerzenia nazwy pliku. Oba są w stanie łączyć się ze standardową biblioteką C ++, ale domyślnie robi to tylko g ++. Więc jeśli masz program napisany w C ++, który nie musi się łączyć ze standardową biblioteką, gcc zrobi właściwą rzecz; ale wtedy też g ++. Tak naprawdę nie ma powodu, aby nie używać g ++ do ogólnego programowania w C ++.
źródło
Zainteresowałem się tym problemem i przeprowadziłem kilka eksperymentów
Znalazłem ten opis tutaj , ale jest bardzo krótki.
Następnie próbowałem eksperymentować z gcc.exe i g ++. Exe na moim komputerze z systemem Windows:
Próbowałem skompilować proste pliki testowe c89, c99 i c ++ 1998 i działa dobrze dla mnie z poprawnymi rozszerzeniami pasującymi do języka
Ale kiedy próbuję uruchomić narzędzie „kolekcja kompilatora GNU” w ten sposób:
Ale ten nadal działa bez błędów
I to też
ps Pliki testowe
Wyniki:
Jeśli spojrzymy na drzewo procesów, to wydaje się, że gcc i g ++ to backend do innych narzędzi, które w moim środowisku to: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc działa dobrze jako metatool, jeśli masz poprawne rozszerzenie lub ustawiłeś poprawne flagi -std -x. Zobacz to
źródło
„GCC” jest powszechnym terminem określającym kolekcję kompilatorów GNU. Jest to zarówno najbardziej ogólna nazwa kompilatora, jak i nazwa używana, gdy nacisk kładziony jest na kompilowanie programów w C (jak wcześniej skrót oznaczał „GNU C Compiler”).
Odnosząc się do kompilacji w C ++, zwykle nazywa się kompilator „G ++”. Ponieważ istnieje tylko jeden kompilator, można go nazwać „GCC” bez względu na kontekst językowy; termin „G ++” jest jednak bardziej przydatny, gdy nacisk kładziony jest na kompilowanie programów w C ++.
Możesz przeczytać więcej tutaj .
źródło
Testowałem gcc i g ++ w systemie linux. Używając MAKEFILE, mogę zdefiniować kompilator używany przez „GNU make”. Testowałem z tak zwaną funkcją lokalizacji „pamięci dynamicznej” „C plus plus” przez:
Tylko g ++ może pomyślnie skompilować na moim komputerze, podczas gdy gcc zgłasza błąd
Więc mój wniosek jest taki, że gcc nie obsługuje w pełni „C plus plus”. Wydaje się, że wybranie g ++ dla plików źródłowych C ++ jest lepszą opcją.
źródło
gcc i g ++ są kompilatorami GNU. Obie kompilują c oraz c ++. Różnica polega na tym, że pliki * .c gcc traktuje to jako program ac, a g ++ traktuje to jako program ac ++. Pliki * .cpp są uważane za programy c ++. c ++ to super zestaw c, a składnia jest bardziej rygorystyczna, więc uważaj na sufiks.
źródło
g++
będzie to również interpretować.cc
jako rozszerzenie pliku tylko do C ++.