2011-03-11 18 views
10

Me pregunto si existe una técnica efectiva para solucionar los problemas de los símbolos indefinidos en gcc. A veces uno de mis proyectos no se puede vincular y generalmente paso mucho tiempo buscando el motivo. Por lo general, se trata de un error tipográfico en un archivo MAKE profundamente oculto, una variable de entorno incorrecta o algo así. ¿Qué método usas si tu construcción muere repentinamente con un "símbolo indefinido" y no es obvio por qué?Técnica general de solución de problemas para los símbolos indefinidos - gcc

+0

Busco en el diccionario la palabra "símbolo" ... (lo siento, es tarde ...) – dappawit

Respuesta

23

decir que esta es mi configuración de inicio:

/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
bar.o: In function `baz()': 
bar.cpp:(.text+0xd): undefined reference to `Foo::bar()' 
collect2: ld returned 1 exit status 

comienzo con buscar el símbolo que falta con grep para todos .o y .lib archivos.

$ grep 'Foo.*bar' *.o *.lib *.so 
Binary file bar.o matches 
Binary file foo.o matches 

Luego uso º nm herramienta para inspeccionar cada archivo de objeto si el símbolo no se encuentra o está implementado.

$ nm foo.o 
00000000 T _ZN3Foo3barEv 

$ nm bar.o 
00000000 T _Z3bazv 
     U _ZN3Foo3barEv 
     U __gxx_personality_v0 

Ahora conozco que Foo :: bar() se implementa en foo.o y puede enlazar este archivo en el ejecutable. Entonces, la siguiente parte es inspeccionar por qué foo.o no está incluido en el comando de enlace.

A veces no encuentra ningún símbolo de implementación. Este suele ser el caso cuando la unidad de implementación no está construida, o no incluye el símbolo (#ifdef, visibilidad del símbolo). En tal caso, busco el archivo .cpp donde se define el símbolo, ejecute make $file.o para generar el archivo e inspeccione el archivo posteriormente. Cuando el símbolo está allí, continúo construyendo la biblioteca o el ejecutable donde se coloca este archivo.

+0

Gracias por su información. También es útil agregar la opción -Wl-t para volcar las bibliotecas conocidas por el enlazador. ¿Sabes algo para los casos realmente difíciles? Por ejemplo, dos bibliotecas estáticas dependientes incluidas en orden incorrecto? – danatel

+0

@danatel Lo siento, pero no tengo una técnica general para depurar dependencias incorrectas de la biblioteca, ya que cada caso es diferente. – Rudi

+0

Esta es una gran respuesta. Preguntándose por qué no ha sido aceptado. –

Cuestiones relacionadas