Qual è la differenza tra g ++ e gcc? Quale di questi dovrebbe essere usato per lo sviluppo generale del c ++?
Qual è la differenza tra g ++ e gcc? Quale di questi dovrebbe essere usato per lo sviluppo generale del c ++?
Risposte:
gcc
e 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' -v
opzione (visualizza i comandi di back-end toolchain in esecuzione).
argv[0]
quale invocazione deve essere usata. Questo è abbastanza comune tra le principali utility UNIX.
GCC: Collezione di compilatori GNU
gcc
: Compilatore
g++
GNU C: compilatore GNU C ++
Le principali differenze:
gcc
compilerà: *.c\*.cpp
file rispettivamente come C e C ++.g++
compilerà: *.c\*.cpp
file ma saranno tutti trattati come file C ++.g++
per collegare i file oggetto, si collega automaticamente nelle librerie std C ++ ( gcc
non lo fa).gcc
la compilazione di file C ha meno macro predefinite.gcc
la compilazione *.cpp
e la g++
compilazione dei *.c\*.cpp
file ha alcune macro extra.Macro extra durante la compilazione di *.cpp
file:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
passando il -lstdc++
parametro.
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. :-)
-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 .
gcc -lstdc++
ad altri sistemi operativi, specialmente quando l'obiettivo è una piattaforma integrata. Fortunatamente, ecco perché spediamo un g ++ in primo luogo.
-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.
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).
Qual è la differenza tra g++
e gcc
?
gcc
si è 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 gcc
afferma che ...
g++
accetta principalmente le stesse opzioni digcc
e che l'impostazione predefinita ...
... l'uso di
gcc
non 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 gcc
pagine man per maggiori dettagli sulle variazioni delle opzioni tra gcc
e g++
.
Quale dovrebbe essere usato per lo sviluppo generale del c ++?
Tecnicamente, gcc
o 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
, omachine-gcc
durante la compilazione incrociata, omachine-gcc-version
eseguire una versione specifica di GCC. Quando compili programmi C ++, dovresti invocare GCC comeg++
invece.
Una notevole differenza è che se passi un .c
file in gcc, questo verrà compilato come C.
Il comportamento predefinito di g ++ è di trattare i .c
file come C ++ (a meno che non -x c
sia specificato).
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.
Mi sono interessato al problema ed eseguire alcuni esperimenti
Ho trovato questa descrizione qui , ma è molto breve.
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
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
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]
Ma questo funziona ancora senza errori
$ gcc -x c++ -std=c++98 test_cpp.c
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:
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
gcc funziona bene come metatool se hai l'estensione corretta o hai impostato i flag -std -x corretti. Vedi questo
"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 .
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.
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.
g++
interpreterà anche .cc
come estensione C ++ - solo nome file.