2008-10-15 7 views
43

he estado recibiendo este edificio símbolo indefinido con esta línea de comandos:Indefinido Símbolo ___gxx_personality_v0 en el enlace

$ gcc test.cpp 
Undefined symbols: 
    "___gxx_personality_v0", referenced from: 
    etc... 

test.cpp es simple y debe construir bien. ¿Cuál es el trato?

+0

¿Podemos ver el código si no es demasiado largo? – jjnguy

Respuesta

73

Uso

g++ test.cpp 

lugar, ya que este es el código C++.


O, si realmente desea utilizar gcc, añadir -lstdc++ a la línea de comandos, así:

gcc test.cpp -lstdc++ 

Correr md5 contra la a.out producido bajo cada escenario muestra que se trata de la misma salida.

Pero, sí, g++ probablemente haga de su mundo un lugar más simple.

+2

Pensé que gcc era la interfaz que reconocía los archivos cpp y los pasaba al compilador correcto. – paxdiablo

+13

@Pax Diablo: Sí, usa el _compiler_ correcto, sin embargo, g ++ pasa libstdC++ al enlazador mientras que gcc no lo hace. :-P –

+0

Correcto, es un problema de engarce, no de compilación. Normalmente no construyo archivos individuales desde la línea de comandos de esta manera, así que ni siquiera pensé y escribí gcc pensando que funcionaría. –

3

La extensión .cpp hace que gcc compile su archivo como un archivo C++. (Véase la GCC docs.)

tratar de compilar el mismo archivo, pero cambiarle el nombre a tener una extensión .c:

mv test.cpp 
gcc test.c 

Alternativamente, puede especificar explícitamente el idioma pasando -x c al compilador:

gcc -x c -c test.cpp -o test.o 

Si ejecuta nm test.o en estas versiones de lenguaje C, se dará cuenta de que ___gxx_personality_v0 no aparece como un símbolo.
(Y si se ejecuta el mismo comando en un archivo objeto generado con gcc -c test.cpp -o test.o, el símbolo ___gxx_personality_v0 está presente.)

3

Sólo en caso de que alguien tiene el mismo problema que yo: La extensión del archivo debe ser no un .c un .C (gcc distingue entre mayúsculas y minúsculas).

+0

Esto se debe a que los archivos .C son reconocidos por cpp. Eso es lo mismo en CMake, por ejemplo. – daminetreg

1

tenía el mismo problema, sino una solución diferente:

código C++ en la biblioteca estática conseguir vinculados, y se está haciendo referencia a un archivo .m. Cambiar el nombre del archivo .m a .mm solucionó el problema.

Cuestiones relacionadas