GCC et ld ne peuvent pas trouver les symboles exportés & # 8230; mais ils sont là
-
03-07-2019 - |
Question
J'ai une bibliothèque C ++ et une application C ++ qui essaient d'utiliser les fonctions et les classes exportées de la bibliothèque. La bibliothèque se construit bien et l'application se compile mais ne parvient pas à se lier. Les erreurs que je reçois suivent ce formulaire:
app-source-file.cpp :(. text + 0x2fdb): référence non définie à `lib-namespace :: GetStatusStr (int) '
L'éditeur de liens semble résoudre parfaitement les classes de la bibliothèque, mais les fonctions libres et les données exportées (telles qu'une table de correspondance en cosinus) entraînent invariablement l'erreur ci-dessus.
J'utilise Ubuntu 8.04 (Hardy) et il est à jour avec les derniers packages Ubuntu.
La commande permettant de lier la bibliothèque est (avec les autres bibliothèques supprimées):
g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
La commande permettant de lier l'application est (avec les autres bibliothèques supprimées):
g++ -fPIC -Wall -O3 -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
Enfin, il apparaît (du mieux que je puisse dire) que les symboles en question sont correctement exportés:
nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
La solution
le U précédant _ZN3lib-namespace12GetStatusStrEi dans la sortie nm indique que le symbole est non défini dans la bibliothèque.
Peut-être qu'il est défini dans le mauvais espace de noms: on dirait que vous l'appelez dans lib-namepace mais vous pouvez le définir dans un autre.
Autres conseils
Cela fait un moment, mais si vous spécifiez une bibliothèque avec l'option -l, vous n'avez pas à ignorer le préfixe de la bibliothèque?
(J'ai changé le nom de "lib-in-question.so" "en" libfoobar.so "pour faciliter la lecture de l'exemple ci-dessous.
g++ -fPIC -Wall -O3 -L~/project/lib/release -lfoobar
ou
g++ -fPIC -Wall -O3 ~/project/lib/release/libfoobar.so