Jaka jest różnica między g ++ a gcc?

875

Jaka jest różnica między g ++ a gcc? Który z nich powinien być użyty do ogólnego programowania w C ++?

Brian R. Bondy
źródło
g ++ => kompilator c ++ gcc => kompilator c
Nagappa

Odpowiedzi:

727

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 ( 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ż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).

Kodiolog
źródło
13
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:

  1. gccskompiluje: *.c\*.cpppliki odpowiednio jako C i C ++.
  2. g++skompiluje: *.c\*.cpppliki, ale wszystkie będą traktowane jak pliki C ++.
  3. Również jeśli użyjesz g++do łączenia plików obiektowych, automatycznie łączy się w bibliotekach std C ++ ( gccnie robi tego).
  4. gcc kompilacja plików C ma mniej predefiniowanych makr.
  5. gcckompilowanie *.cppi g++kompilowanie *.c\*.cppplików ma kilka dodatkowych makr.

Dodatkowe makra podczas kompilacji *.cppplików:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Martin York
źródło
37
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ń).

Nils Pipenbrinck
źródło
3
+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.

Jest g++ to kompilator C ++ dla kolekcji kompilatorów GNU. Podobnie gnatjak kompilator Ada gcc. zobacz Korzystanie z kolekcji kompilatora GNU (GCC)

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 ++.

Stronę Ubuntu 18.04 człowiek dodany następujący akapit:

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++.

l - marc l
źródło
21

Istotną różnicą jest to, że jeśli przekażesz .cplik do gcc, skompiluje się jako C.

Domyślne zachowanie g ++ polega na traktowaniu .cplików jak C ++ (chyba że -x cpodano inaczej ).

njsf
źródło
19
(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 ++.

zaphod
źródło
12

Zainteresowałem się tym problemem i przeprowadziłem kilka eksperymentów

  1. Znalazłem ten opis tutaj , ale jest bardzo krótki.

  2. Następnie próbowałem eksperymentować z gcc.exe i g ++. Exe na moim komputerze z systemem Windows:

    $ 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. 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

    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. Ale kiedy próbuję uruchomić narzędzie „kolekcja kompilatora GNU” w ten sposób:

    $ 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. Ale ten nadal działa bez błędów

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. I to też

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

ps Pliki testowe

$ 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;
}

Wyniki:

  1. 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

  2. gcc działa dobrze jako metatool, jeśli masz poprawne rozszerzenie lub ustawiłeś poprawne flagi -std -x. Zobacz to

bruziuz
źródło
9

„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 .

Minh-Triet Pham Tran
źródło
0

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 = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

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ą.

magicmax
źródło
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.

Marcus Thornton
źródło
1
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 ++.
underscore_d