Qual è la differenza tra g ++ e gcc?


875

Qual è la differenza tra g ++ e gcc? Quale di questi dovrebbe essere usato per lo sviluppo generale del c ++?


g ++ => compilatore c ++ gcc => compilatore c
Nagappa,

Risposte:


727

gcce g++sono driver di compilazione della GNU Compiler Collection (che una volta era solo il compilatore GNU C ).

Anche se determinano automaticamente quali backend ( cc1 cc1plus...) chiamare in base al tipo di file, a meno che non vengano sovrascritti -x language, presentano alcune differenze.

La differenza probabilmente più importante nelle impostazioni predefinite è a quali librerie si collegano automaticamente.

Secondo le opzioni di collegamento della documentazione online di GCC e il modo in cui viene invocato g ++ , g++equivale a gcc -xc++ -lstdc++ -shared-libgcc(il primo è un'opzione del compilatore, il secondo due sono opzioni del linker). Questo può essere verificato eseguendo entrambi con l' -vopzione (visualizza i comandi di back-end toolchain in esecuzione).


13
Da questa risposta, concludo che effettivamente il comando g ++ è solo gcc con un gruppo di flag. Perché allora, ci sono due binari diversi (approssimativamente della stessa dimensione) per gcc e g ++ in Linux? Non dovremmo avere solo un binario e un link simbolico (o qualcosa del genere)?
UchihaItachi,

9
@Uchihaltachi questi file sono hard link e quando vengono avviati controllano argv[0]quale invocazione deve essere usata. Questo è abbastanza comune tra le principali utility UNIX.
Assapora il

438

GCC: Collezione di compilatori GNU

  • Referrer per tutte le diverse lingue supportate dal compilatore GNU.

gcc: Compilatore
g++GNU C: compilatore GNU C ++

Le principali differenze:

  1. gcccompilerà: *.c\*.cppfile rispettivamente come C e C ++.
  2. g++compilerà: *.c\*.cppfile ma saranno tutti trattati come file C ++.
  3. Inoltre, se si utilizza g++per collegare i file oggetto, si collega automaticamente nelle librerie std C ++ ( gccnon lo fa).
  4. gcc la compilazione di file C ha meno macro predefinite.
  5. gccla compilazione *.cppe la g++compilazione dei *.c\*.cppfile ha alcune macro extra.

Macro extra durante la compilazione di *.cppfile:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

37
È possibile collegare la libreria C ++ std gccpassando il -lstdc++parametro.
Denilson Sá Maia,

16
Ci sono più differenze tra 'gcc' e 'g ++' rispetto alle sole librerie standard, quindi gcc -lstdc++non otterrai ancora lo stesso comportamento di g++. Mettiamo tutto quel comportamento specifico della lingua nel suo driver per una ragione, ecco a cosa serve. :-)
Ti Strga,

8
Il mio commento non parla solo di link ... questo è il punto. Anche solo limitando la discussione al collegamento (che la risposta non era), un utente ancora non sarà in grado di utilizzare l'intera libreria standard C ++ specificando solo -lstdc++, come ci saranno dipendenze mancanti sulla matematica, RTTI, e informazioni sulle eccezioni. Se un determinato test case si collega o fallisce dipenderà dal sistema operativo e quali funzionalità C ++ sono utilizzate dal test case, motivo per cui tutta questa conoscenza è integrata nel driver g ++ invece di essere lasciata all'utente per capire .
Ti Strga,

10
Fidati di me, discutiamo molto, di solito quando un utente Linux cerca di spostare il suo Makefile incompleto su un'altra piattaforma. :-) La fase di collegamento g ++ fa molto di più rispetto gcc -lstdc++ad altri sistemi operativi, specialmente quando l'obiettivo è una piattaforma integrata. Fortunatamente, ecco perché spediamo un g ++ in primo luogo.
Ti Strga,

10
Le stringhe di specifica sono costruite in modo specifico per il compilatore, che a loro volta sono specifiche per il sistema operativo e la destinazione. Quindi, se corri -dumpspec(ad esempio) su un compilatore multiplo destinato a un sistema incorporato, vedrai le differenze. Ci sono più di una semplice differenza tra i linker ... che di nuovo è la risposta (macro preprocessore, percorsi di inclusione, più librerie di runtime). Sembra che stiamo parlando l'uno di fronte all'altro, ma come ex manutentore del GCC, ti assicuro che ho familiarità con ciò che i frontend sono e non sono.
Ti Strga,

82

Per c ++ dovresti usare g ++.

È lo stesso compilatore (ad esempio la raccolta di compilatori GNU). GCC o G ++ scelgono semplicemente un front-end diverso con diverse opzioni predefinite.

In poche parole: se usi g ++ il frontend dirà al linker che potresti voler collegarti con le librerie standard C ++. Il frontend gcc non lo farà (potrebbe anche collegarsi con loro se si passano le giuste opzioni della riga di comando).


3
+1 Anche la mia pagina man GNU / Linux gcc dice "Quando compili programmi C ++, dovresti invece invocare GCC come g ++".
Vista ellittica il

35

Qual è la differenza tra g++e gcc?

gccsi è evoluto da un unico "compilatore GNU C" in una "raccolta di compilatori GNU" multilingue. Il termine "compilatore GNU C" viene ancora talvolta utilizzato nel contesto della programmazione C.

Il g++ è il compilatore C ++ per la GNU Compiler Collection. Come gnatè il compilatore Ada per gcc. vedi Usare la GNU Compiler Collection (GCC)

Ad esempio, il man g++comando Ubuntu 16.04 e 18.04 restituisce la GCC(1)pagina del manuale.

Ubuntu 16.04 e 18.04 man gccafferma che ...

g++ accetta principalmente le stesse opzioni di gcc

e che l'impostazione predefinita ...

... l'uso di gccnon aggiunge la libreria C ++. g++è un programma che chiama GCC e specifica automaticamente il collegamento con la libreria C ++. Tratta i file .c, .h e .i come file sorgente C ++ anziché come file sorgente C a meno che non venga usato -x. Questo programma è utile anche durante la precompilazione di un file di intestazione C con estensione .h da utilizzare nelle compilazioni C ++.

Cerca nelle gccpagine man per maggiori dettagli sulle variazioni delle opzioni tra gcce g++.

Quale dovrebbe essere usato per lo sviluppo generale del c ++?

Tecnicamente, gcco g++può essere utilizzato per lo sviluppo C ++ generale con le impostazioni delle opzioni applicabili. Tuttavia, il g++comportamento predefinito è naturalmente allineato a uno sviluppo C ++.

La pagina man di Ubuntu 18.04 ha aggiunto il seguente paragrafo:

Il solito modo per eseguire GCC è eseguire il file eseguibile chiamato gcc, o machine-gccdurante la compilazione incrociata, o machine-gcc-versioneseguire una versione specifica di GCC. Quando compili programmi C ++, dovresti invocare GCC come g++invece.


21

Una notevole differenza è che se passi un .cfile in gcc, questo verrà compilato come C.

Il comportamento predefinito di g ++ è di trattare i .cfile come C ++ (a meno che non -x csia specificato).


19
(In ritardo, ma per i posteri). Come hanno sottolineato altre risposte, questa non è affatto "l'unica differenza notevole", a meno che il lettore non abbia una definizione distorta di notabilità.
underscore_d,

16

Sebbene i comandi gcc e g ++ facciano cose molto simili, g ++ è progettato per essere il comando che invocheresti per compilare un programma C ++; è destinato a fare automaticamente la cosa giusta.

Dietro le quinte, sono davvero lo stesso programma. A quanto ho capito, entrambi decidono se compilare un programma come C o come C ++ in base all'estensione del nome file. Entrambi sono in grado di collegarsi alla libreria standard C ++, ma solo g ++ lo fa di default. Quindi se hai un programma scritto in C ++ che non deve necessariamente collegarsi alla libreria standard, gcc farà la cosa giusta; ma poi, anche g ++. Quindi non c'è davvero alcun motivo per non usare g ++ per lo sviluppo C ++ generale.


12

Mi sono interessato al problema ed eseguire alcuni esperimenti

  1. Ho trovato questa descrizione qui , ma è molto breve.

  2. Quindi ho provato a sperimentare gcc.exe e g ++. Exe sul mio computer 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. Ho provato a compilare file di test semplici c89, c99 e c ++ 1998 e funziona bene per me con le estensioni corrette per la lingua

    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. Ma quando provo a eseguire lo strumento "raccolta compilatore gnu" in quel modo:

    $ 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. Ma questo funziona ancora senza errori

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. E anche questo

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

ps File di test

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

I risultati:

  1. Se guardiamo l'albero dei processi, allora sembra che gcc e g ++ siano backend ad altri strumenti, che nel mio ambiente sono: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe

  2. gcc funziona bene come metatool se hai l'estensione corretta o hai impostato i flag -std -x corretti. Vedi questo


9

"GCC" è un termine abbreviato comune per la raccolta di compilatori GNU. Questo è sia il nome più generico per il compilatore, sia il nome usato quando l'accento è posto sulla compilazione di programmi C (dato che l'abbreviazione in precedenza significava "compilatore GNU C").

Quando si fa riferimento alla compilazione C ++, è normale chiamare il compilatore "G ++". Poiché esiste un solo compilatore, è anche preciso chiamarlo "GCC", indipendentemente dal contesto linguistico; tuttavia, il termine "G ++" è più utile quando l'accento è posto sulla compilazione di programmi C ++.

Puoi leggere di più qui .


0

Stavo testando gcc e g ++ in un sistema linux. Usando MAKEFILE, posso definire il compilatore usato da "GNU make". Ho provato con la cosiddetta funzione di localizzazione "memoria dinamica" di "C plus plus" di:

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

Solo g ++ può essere compilato correttamente sul mio computer mentre gcc segnalerà un errore

undefined reference to `operator new(unsigned long)'

Quindi la mia conclusione è che gcc non supporta completamente "C plus plus". Sembra che scegliere g ++ per i file sorgente C ++ sia un'opzione migliore.


Devi fare due lavori: 1. seleziona la lingua 2. scegli un po 'di libreria come libstdc ++
PersianGulf

-1

gcc e g ++ sono entrambi compilatori GNU. Entrambi compilano c e c ++. La differenza è per i file * .c gcc lo considera come programma ac e g ++ lo vede come programma ac ++. I file * .cpp sono considerati programmi c ++. c ++ è un super set di c e la sintassi è più rigorosa, quindi fai attenzione al suffisso.


1
C ++ è un linguaggio diverso, non un superset rigoroso di C, quindi la compilazione con la lingua di destinazione sbagliata potrebbe produrre risultati inaspettati. Si noti inoltre che g++interpreterà anche .cccome estensione C ++ - solo nome file.
underscore_d,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.