Compilare un programma C ++ con gcc


88

Domanda: come si compila un programma C ++ con il compilatore 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

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


Risposte:


138

gcc può effettivamente compilare codice c ++ senza problemi. Gli errori che hai ricevuto sono linker errori del , non errori del compilatore.

Le probabilità sono che se cambi la riga di compilazione in questa:

gcc info.C -lstdc++

il che lo rende collegato alla libreria standard c ++, quindi funzionerà perfettamente.

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


MODIFICARE:

Rup lo dice meglio nel suo commento a un'altra risposta:

[...] gcc selezionerà il compilatore back-end corretto in base all'estensione del file (cioè compilerà un .c come C e un .cc come C ++) e collega i binari alle sole librerie di supporto standard C e GCC per impostazione predefinita indipendentemente da lingue di input; g ++ selezionerà anche il back-end corretto in base all'estensione tranne per il fatto che penso che compili invece tutti i sorgenti C come C ++ (cioè compila sia .c che .cc come C ++) e include libstdc ++ nel suo passaggio di collegamento indipendentemente dai linguaggi di input.


42

Se si assegna al codice un'estensione .c, il compilatore pensa che sia codice C, non C ++. E il driver del compilatore C ++ si chiama g ++, se usi il driver gcc avrai problemi con il linker, poiché le librerie C ++ standard non saranno collegate per impostazione predefinita. Quindi tu vuoi:

g++ myprog.cpp

E non prendere nemmeno in considerazione l'utilizzo di un'estensione .C maiuscola, a meno che tu non voglia mai portare il tuo codice e sei pronto a essere odiato da coloro con cui lavori.


@ Neil: da quello che posso dire, gcc considera .Cun'estensione (maiuscola) un'estensione c ++. Quanto segue funziona perfettamente: gcc test.C -lstdc++ -o testo g++ test.C -o test.
Evan Teran

3
@Evan Sì, certo che lo fa. Ciò non significa che dovresti mai usarlo, poiché causerà terribili problemi di portabilità, come fanno 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.


12

Per impostazione predefinita, gcc seleziona la lingua in base all'estensione del file, ma puoi forzare gcc a selezionare un backend di lingua diverso con l'opzione -x in questo modo:

gcc -x c++

Altre opzioni sono dettagliate nella pagina man di gcc in "Opzioni che controllano il tipo di output". Vedi ad esempio http://linux.die.net/man/1/gcc (cerca nella pagina il testo-x language ).

Questa funzione è molto utile nei casi in cui gcc non riesce a indovinare la lingua utilizzando un'estensione di file, ad esempio se stai generando codice e alimentandolo a gcc tramite stdin.


11

Le differenze tra gcc e g ++ sono:

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

usa g ++ invece di gcc per compilare il tuo sorgente c ++.


16
È un po 'più complicato di così, come nelle altre risposte qui. gcc selezionerà il compilatore back-end corretto in base all'estensione del file (cioè compilerà un .c come C e un .cc come C ++) e collega i file binari solo alle librerie helper standard C e GCC per impostazione predefinita, indipendentemente dai linguaggi di input; g ++ selezionerà anche il back-end corretto in base all'estensione tranne per il fatto che penso che compili invece tutti i sorgenti C come C ++ (cioè compila sia .c che .cc come C ++) e include libstdc ++ nel suo passaggio di collegamento indipendentemente dai linguaggi di input.
Rup

1
@ Rup: ​​corretto, questo è fondamentalmente quello che stavo dicendo nella mia risposta.
Evan Teran

1

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

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


1

Ha funzionato bene nel mio caso. Un solo codice di riga in cmd.

Per prima cosa, conferma di aver installato il compilatore gcc (per c) o g ++ (per c ++).

In cmd per gcc digitare:

gcc --version

in cmd per il tipo g ++:

g ++ --versione

Se è installato, procedere.

Ora, compila il tuo .c o .cpp usando cmd

per la sintassi .c :

gcc -o exe_filename nomefile.c

Esempio:

gcc -o miofile miofile.c

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

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

Per la sintassi .cpp :

g ++ -o exe_filename yourfilename.cpp

Dopo di che il processo è lo stesso di .c.


2
La domanda era "Come compilare un programma C ++ con il compilatore gcc?" non "Come compilare un programma C con il compilatore gcc? o Come compilare un programma C ++ con il compilatore g ++?"
DevX

Bella presa! @DevX
Rajkumar Bansal
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.