2010-07-05 19 views
40

Pregunta: ¿Cómo compilar un programa en C++ con el compilador gcc?Compilación de un programa 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; 
} 

y cuando intento compilar 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 

No es compilador gcc capaz de compilar programas en C++? En una nota relacionada, ¿cuál es la diferencia entre gcc y g ++. Gracias,

+0

Posible duplicado de [¿Cuál es la diferencia entre g ++ y gcc?] (Https://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc) –

Respuesta

77

gcc realmente puede compilar el código de C++ bien. Los errores que recibió son errores del vinculador, no errores del compilador.

Lo más probable es que si cambia la línea de compilación ser la siguiente:

gcc info.C -lstdc++ 

que hace que sea enlazar a la biblioteca de C++ estándar, entonces todo funcionará bien.

Sin embargo, solo debe hacer su vida más fácil y usar g ++.


EDIT:

Rup dice mejor en his comment a otra respuesta:

[...] GCC seleccione el back-end correcta compilador basado en archivo extensión (es decir, compilar a .c como C y a.cc como C++) y enlaces binarios contra solo las bibliotecas auxiliares C y GCC por defecto por defecto independientemente de los idiomas de entrada; g ++ también seleccionará el back-end correcto basado en la extensión excepto que creo que compila todos fuente C como C++ en lugar (es decir, que compila tanto .c y .cc como C++) e incluye libstdC++ en su enlace paso independientemente de los idiomas de entrada.

15

use g++ en lugar de gcc.

1

Si no recuerdo mal, gcc determina el tipo de archivo del sufijo. Entonces, hazlo foo.cc y debería funcionar.

Y, para responder a su otra pregunta, que es la diferencia entre "gcc" y "g ++". gcc es una interfaz que elige el compilador correcto.

29

Si le da al código una extensión .c el compilador piensa que es código C, no C++. Y el controlador del compilador C++ se llama g ++; si usa el controlador gcc, tendrá problemas con los enlazadores, ya que las bibliotecas estándar de C++ no se vincularán de forma predeterminada. Por lo que desea:

g++ myprog.cpp 

y ni siquiera considerar el uso de una extensión .C mayúsculas, a menos que nunca desea portar su código, y está dispuesto a ser odiado por quienes trabajan con usted.

+0

@Neil: por lo que puedo decir, gcc considera una extensión '.C' (capital) una extensión de C++. Lo siguiente funciona bien: 'gcc test.C -lstdC++ -o test' o' g ++ test.C -o test'. –

+2

@Evan Sí, por supuesto que sí. Sin embargo, eso no significa que deba usarlo, ya que causará terribles problemas de portabilidad, como lo hacen todos los nombres de archivo que distinguen entre mayúsculas y minúsculas. La extensión para archivos C++ siempre debe ser .cpp. Esto no causa problemas y está garantizado para funcionar en todos los sistemas operativos comunes. –

4

La diferencia entre gcc y g ++ son:

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

uso g ++ en lugar de gcc para compilar que C++ fuente.

+11

Es un poco más complicado que eso, como en las otras respuestas aquí. gcc seleccionará el compilador de fondo correcto basado en la extensión de archivo (es decir, compilará un .c como C y un .cc como C++) y vinculará los binarios únicamente con las bibliotecas de ayuda estándar C y GCC, independientemente de los idiomas de entrada; g ++ también seleccionará el back-end correcto basado en la extensión, excepto que creo que compila todas las fuentes de C como C++ (es decir, compila tanto .c como .cc como C++) e incluye libstdC++ en su paso de enlace independientemente de los idiomas de entrada. – Rup

+0

@Rup: correcto, esto es básicamente lo que estaba diciendo en mi respuesta. –

2

Puede forzar el uso de gcc para seleccionar un idioma diferente backend con la opción -x así:

gcc -x c++ 

Más opciones se detallan en la página man gcc bajo. Ver p. http://linux.die.net/man/1/gcc

Esta función es muy útil en casos donde gcc no puede adivinar el idioma usando una extensión de archivo, por ejemplo, si está generando código y alimentándolo a gcc vía stdin.

2

Me funcionó bien. Solo un código de línea en cmd.

En primer lugar, confirmar que se ha instalado el gcc (por c) o ++ (para C++) compilador g.

En cmd para el tipo gcc:

gcc --version

en cmd para g ++ tipo:

g ++ --version

Si se instala entonces proceder .

Ahora, compilar su .c o .cpp utilizando cmd

para .c sintaxis:

gcc -o exe_filename yourfilename.c

Ejemplo:

gcc -o myfile myfile.c

Aquí exe_filename (myfile en el ejemplo) es el nombre de su archivo .exe que desea producir después de la compilación (Nota: no he puesto ninguna extensión aquí). Y yourfilename.c (myfile.c en el ejemplo) es el su archivo fuente que tiene la extensión .c.

Ahora vaya a la carpeta que contiene su archivo .c, aquí encontrará un archivo con extensión .exe. Solo ábrelo. Hurra ..

Para .CPP sintaxis:

g ++ -o exe_filename yourfilename.cpp

Después de que el proceso es el mismo que para .c.

Cuestiones relacionadas