GCC y ld no pueden encontrar los símbolos exportados & # 8230; pero están ahí
-
03-07-2019 - |
Pregunta
Tengo una biblioteca C ++ y una aplicación C ++ que intenta utilizar funciones y clases exportadas desde la biblioteca. La biblioteca se construye bien y la aplicación compila pero no puede enlazar. Los errores que recibo siguen este formulario:
app-source-file.cpp :(. text + 0x2fdb): referencia no definida a `lib-namespace :: GetStatusStr (int) '
Las clases en la biblioteca parecen ser resueltas correctamente por el vinculador, pero las funciones libres y los datos exportados (como una tabla de búsqueda de coseno) siempre producen el error anterior.
Estoy usando Ubuntu 8.04 (Hardy), y está actualizado con los últimos paquetes de Ubuntu.
El comando para vincular la biblioteca es (con otras bibliotecas eliminadas):
g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
El comando para vincular la aplicación es (con otras bibliotecas eliminadas):
g++ -fPIC -Wall -O3 -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
Finalmente, parece (lo mejor que puedo decir) que los símbolos en cuestión se están exportando correctamente:
nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
Solución
la U antes de _ZN3lib-namespace12GetStatusStrEi en la salida de nm muestra que el símbolo es indefinido en la biblioteca.
Quizás esté definido en el espacio de nombres incorrecto: parece que lo está llamando en lib-namepace pero podría estar definiéndolo en otro.
Otros consejos
Ha pasado un tiempo, pero si especifica una lib con la opción -l, ¿no tiene el omitir el prefijo lib?
(Cambié el nombre de '' lib-in-question.so '' a '' libfoobar.so '' para una lectura más fácil para el ejemplo a continuación)
g++ -fPIC -Wall -O3 -L~/project/lib/release -lfoobar
o
g++ -fPIC -Wall -O3 ~/project/lib/release/libfoobar.so