2010-07-05 5 views
40

Domanda: Come compilare un programma C++ con il compilatore gcc?Compilare un programma C++ con gcc

info.c:

#include<iostream> 
using std::cout; 
using std::endl; 
int main() 
{ 
    #ifdef __cplusplus 
    cout << "C++ compiler in use and version is " << __cplusplus << endl; 
    #endif 
    cout <<"Version is " << __STDC_VERSION__ << endl; 
    cout << "Hi" << __FILE__ << __LINE__ << endl; 
} 

e quando provo a compilare info.c

$ gcc info.C

Undefined      first referenced 
symbol        in file 
cout        /var/tmp/ccPxLN2a.o 
endl(ostream &)      /var/tmp/ccPxLN2a.o 
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o 
ostream::operator<<(int)   /var/tmp/ccPxLN2a.o 
ostream::operator<<(long)   /var/tmp/ccPxLN2a.o 
ostream::operator<<(char const *) /var/tmp/ccPxLN2a.o 
ld: fatal: Symbol referencing errors. No output written to a.out 
collect2: ld returned 1 exit status 

non è compilatore gcc in grado di compilare programmi C++? Su una nota correlata, qual è la differenza tra gcc e g ++. Grazie,

+0

Possibile duplicato di [Qual è la differenza tra g ++ e gcc?] (Https://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc) –

risposta

77

gcc può effettivamente compilare codice C++ proprio bene. Gli errori che hai ricevuto sono errori linker, non errori del compilatore.

Le probabilità sono che se si cambia la linea di compilazione essere questo:

gcc info.C -lstdc++ 

che lo rende collegamento con la standard C++ library, allora funzionerà bene.

Tuttavia, dovresti semplificarti la vita e usare g ++.


EDIT:

Rup dice che la cosa migliore in his comment ad un'altra risposta:

[...] GCC sarà selezionare la corretta back-end del compilatore sulla base di file estensione (ad esempio, compila un file .c come C e a.cc come C++) e collega i binari solo alle librerie di helper C e GCC standard tramite il valore predefinito, indipendentemente dalle lingue di input; g ++ anche selezionare il corretto back-end basato su un'estensione tranne che ritengo raccoglie tutte sorgente C come C++ invece (cioè compila sia .c e .cc come C++) e comprende libstdC++ nel suo legame passo indipendentemente delle lingue di input.

15

utilizzare g++ anziché gcc.

1

Se ricordo correttamente, gcc determina il tipo di file dal suffisso. Quindi, fallo foo.cc e dovrebbe funzionare.

E, per rispondere alla tua altra domanda, che è la differenza tra "gcc" e "g ++". gcc è un frontend che sceglie il compilatore corretto.

29

Se si assegna al codice un'estensione .c, il compilatore pensa che sia il codice C, non il C++. E il driver del compilatore C++ si chiama g ++, se si utilizza il driver gcc si avranno problemi di linker, in quanto le librerie C++ standard non saranno collegate per impostazione predefinita. Così si vuole:

g++ myprog.cpp 

E non prendono nemmeno in considerazione utilizzando un'estensione .C maiuscolo, a meno che non si vuole porta il codice, e sono pronti a essere odiato da coloro che si lavora con.

+0

@Neil: da quello che posso dire, gcc considera un'estensione '.C' (maiuscola) un'estensione C++. Il seguente funziona bene: 'gcc test.C -lstdC++ -o test' o' g ++ test.C -o test'. –

+2

@Evan Sì, certo che sì. Ciò non significa che dovresti comunque usarlo, poiché causerà terribili problemi di portabilità, come tutti i nomi di file con distinzione tra maiuscole e minuscole. L'estensione per i file C++ dovrebbe sempre essere .cpp. Ciò non causa problemi ed è garantito che funzioni su tutti i sistemi operativi comuni. –

4

La differenza tra gcc e g ++ sono:

 gcc   |  g++ 
compiles c source | compiles c++ source 

uso g ++ al posto di gcc per compilare voi C++ fonte.

+11

È un po 'più complicato di così, come nelle altre risposte qui. gcc selezionerà il compilatore back-end corretto in base all'estensione del file (ad esempio, compilerà un file .c come C e a .cc come C++) e collegherà i file binari solo alle librerie di helper C e GCC standard, indipendentemente dai linguaggi di input; g ++ selezionerà anche il back-end corretto basato sull'estensione, tranne che penso che compili tutti i sorgenti C come C++ (cioè compila sia .c che .cc come C++) e include libstdC++ nella sua fase di collegamento, indipendentemente dai linguaggi di input. – Rup

+0

@Rup: corretto, questo è fondamentalmente quello che stavo dicendo nella mia risposta. –

2

È possibile forzare l'uso gcc per selezionare una lingua diversa backend con l'opzione -x così:

gcc -x c++ 

Più opzioni sono dettagliate nella pagina man gcc sotto. Vedi per es. http://linux.die.net/man/1/gcc

Questa funzione è molto utile nei casi in cui gcc non può indovinare la lingua utilizzando un'estensione di file, ad esempio se si genera codice e lo si alimenta a gcc tramite stdin.

2

Ha funzionato bene per me. Solo un codice di riga in cmd.

In primo luogo, verificare di aver installato il gcc (per c) o g ++ (per C++) compilatore.

In cmd per tipo gcc:

gcc --version

cmd per g ++ Tipo:

g ++ --version

Se installato quindi procedere .

Ora, compilare il .co cpp utilizzando cmd

per .c sintassi:

gcc -o exe_filename yourfilename.c

Esempio:

gcc -o myfile myfile.c

Qui exe_filename (myfile nell'esempio) è il nome di il file .exe che si desidera produrre dopo la compilazione (Nota: non ho inserito alcuna estensione qui). E yourfilename.c (myfile.c nell'esempio) è il il file di origine che ha l'estensione .c.

Ora vai alla cartella contenente il tuo file .c, qui troverai un file con estensione .exe. Basta aprirlo. Evviva ..

per .cpp sintassi:

g ++ -o exe_filename yourfilename.cpp

Dopo che il processo è uguale per .c.