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
Respuesta
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.
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
@danatel Lo siento, pero no tengo una técnica general para depurar dependencias incorrectas de la biblioteca, ya que cada caso es diferente. – Rudi
Esta es una gran respuesta. Preguntándose por qué no ha sido aceptado. –
- 1. Objetivo-C - Símbolos indefinidos
- 2. Obteniendo "Símbolos indefinidos" cuando intenta utilizar EventKit?
- 3. gcc 4.8 en MAC OS X 10.8 arroja "Símbolos indefinidos para la arquitectura x86_64:"
- 4. Encontrar símbolos indefinidos en Windows lib
- 5. Símbolos indefinidos para arquitectura i386, ¿construcción para iOS?
- 6. C++/Boost: Símbolos indefinidos en el ejemplo?
- 7. Símbolos indefinidos "vtable for ..." and "typeinfo for ..."?
- 8. Símbolos indefinidos para architecture armv7? ¿Qué significa este error?
- 9. Invalidación de caché: ¿hay una solución general?
- 10. Solución de problemas para instalar Gherkin 2.1.5
- 11. Solución de problemas BadImageFormatException
- 12. Una solución para todos los problemas de IE6
- 13. Solución de problemas ERROR_NOT_ENOUGH_MEMORY
- 14. En GCC, ¿cómo puedo exportar todos los símbolos de typeinfo para una biblioteca compartida sin exportar todos los símbolos?
- 15. Error "símbolos indefinidos" de la función en línea
- 16. gcc: habilitar los símbolos de depuración en la biblioteca compartida
- 17. Win32: Solución de problemas para GetFileAttributes()
- 18. Solución de problemas system.io.fileloadexception
- 19. ¿Por qué las funciones estáticas eliminan símbolos indefinidos en Xcode?
- 20. gcc vs. clang: extracción de símbolos
- 21. ¿Problemas y con qué técnica de algoritmo se pueden resolver?
- 22. ¿Cómo detectar inteligentemente símbolos indefinidos cuando se vincula un complemento en GNU/Linux?
- 23. Símbolos indefinidos para la arquitectura armv7, ld: símbolo (s) no aparecido para architecture armv7 - qué hacer?
- 24. La conversión .mm causa símbolos indefinidos para la arquitectura Errores de i386
- 25. ¿Cuál es el problema con los símbolos indefinidos en una biblioteca compartida o dylib?
- 26. Técnicas de solución de problemas para Emacs y Emacs Lisp
- 27. C - Símbolos indefinidos para la arquitectura x86_64 al compilar en Mac OSX Lion
- 28. Cómo puedo obtener gcc para agregar un prefijo a todos los nombres de símbolos
- 29. Solución de problemas de error de bus
- 30. Solución de problemas de SQL Server Timeout
Busco en el diccionario la palabra "símbolo" ... (lo siento, es tarde ...) – dappawit