Compilar un programa C ++ con gcc


84

Pregunta: ¿Cómo compilar un programa C ++ con el compilador 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 trato de 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 el compilador gcc capaz de compilar programas C ++? En una nota relacionada, ¿cuál es la diferencia entre gcc y g ++. Gracias,


Respuestas:


136

gcc realmente puede compilar código c ++ muy 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 para que sea esta:

gcc info.C -lstdc++

lo que hace que se vincule a la biblioteca estándar de C ++, entonces funcionará bien.

Sin embargo, debería hacer su vida más fácil y usar g ++.


EDITAR:

Rup lo dice mejor en su comentario a otra respuesta:

[...] gcc seleccionará el compilador de back-end correcto según la extensión del archivo (es decir, compilará un .c como C y un .cc como C ++) y enlazará binarios solo con las bibliotecas auxiliares estándar C y GCC de forma predeterminada, independientemente de idiomas de entrada; g ++ también seleccionará el back-end correcto según la extensión, excepto que creo que compila todas las fuentes C como C ++ en su lugar (es decir, compila tanto .cy .cc como C ++) e incluye libstdc ++ en su paso de enlace independientemente de los lenguajes de entrada.


41

Si le da al código una extensión .c, el compilador cree que es código C, no C ++. Y el controlador del compilador de C ++ se llama g ++, si usa el controlador gcc tendrá problemas con el vinculador, ya que las bibliotecas estándar de C ++ no estarán vinculadas por defecto. Entonces quieres:

g++ myprog.cpp

Y ni siquiera considere usar una extensión .C en mayúsculas, a menos que nunca quiera portar su código y esté preparado para ser odiado por aquellos con quienes trabaja.


@Neil: por lo que puedo decir, gcc considera una .Cextensión (mayúscula) como una extensión de c ++. Lo siguiente funciona bien: gcc test.C -lstdc++ -o testo g++ test.C -o test.
Evan Teran

3
@Evan Sí, por supuesto que sí. Sin embargo, eso no significa que deba usarlo alguna vez, ya que causará terribles problemas de portabilidad, al igual que todos los nombres de archivos que distinguen entre mayúsculas y minúsculas. La extensión de los archivos C ++ siempre debe ser .cpp. Esto no causa problemas y se garantiza que funciona en todos los sistemas operativos comunes.


12

De forma predeterminada, gcc selecciona el idioma en función de la extensión del archivo, pero puede obligar a gcc a seleccionar un backend de idioma diferente con la opción -x de esta manera:

gcc -x c++

Más opciones se detallan en la página de manual de gcc en "Opciones que controlan el tipo de salida". Véase, por ejemplo, http://linux.die.net/man/1/gcc (busque el texto en la página -x language).

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


11

La diferencia entre gcc y g ++ son:

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

use g ++ en lugar de gcc para compilar su fuente de c ++.


16
Es un poco más complicado que eso, como en las otras respuestas aquí. gcc seleccionará el compilador back-end correcto según la extensión del archivo (es decir, compilará un .c como C y un .cc como C ++) y enlazará binarios solo con las bibliotecas auxiliares estándar C y GCC de forma predeterminada, independientemente de los lenguajes de entrada; g ++ también seleccionará el back-end correcto según la extensión, excepto que creo que compila todo el código fuente C como C ++ en su lugar (es decir, compila tanto .cy .cc como C ++) e incluye libstdc ++ en su paso de enlace independientemente de los lenguajes de entrada.
Rup

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

1

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

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


1

Funciono bien para mi. Solo un código de línea en cmd.

Primero, confirme que ha instalado el compilador gcc (para c) o g ++ (para c ++).

En cmd para el tipo gcc:

gcc --versión

en cmd para el tipo g ++:

g ++ --versión

Si está instalado, continúe.

Ahora, compile su .co .cpp usando cmd

para la sintaxis .c :

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 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. Viva..

Para la sintaxis .cpp :

g ++ -o exe_filename yourfilename.cpp

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


2
La pregunta era "¿Cómo compilar un programa C ++ con el compilador gcc?" no "¿Cómo compilar un programa C con el compilador gcc? o ¿Cómo compilar un programa C ++ con el compilador g ++?"
DevX

¡Buena atrapada! @DevX
Rajkumar Bansal
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.