2008-10-19 8 views
3

J'ai une bibliothèque C++ et une application C++ essayant d'utiliser les fonctions et les classes exportées de la bibliothèque. La bibliothèque se construit correctement et l'application compile mais ne parvient pas à lier. Les erreurs je reçois suivre ce formulaire:GCC et ld ne peuvent pas trouver les symboles exportés ... mais ils sont là!

app-source file.cpp :(texte + 0x2fdb):. Undefined reference to `lib-namespace :: GetStatusStr (int) »

Classes dans la bibliothèque semblent être résolus très bien par le lieur, mais les fonctions libres et les données exportées (comme une table de recherche de cosinus) entraînent invariablement l'erreur ci-dessus.

J'utilise Ubuntu 8.04 (Hardy), et il est à jour avec les derniers paquets unbuntu.

La commande pour relier la bibliothèque est (avec d'autres bibliothèques enlevées):

g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so 

La commande de lier l'application est (avec d'autres bibliothèques enlevé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 peux dire) que les symboles en question sont exportés correctement:

nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi 
+0

Vous n'êtes pas nous donner assez d'informations; par conséquent, vous obtiendrez beaucoup de fausses suppositions. Vous avez probablement fait une simple erreur. Simplifiez le code nécessaire pour reproduire l'erreur au minimum. Puis postez-le avec les commandes shell réelles, et leur sortie, ce qui conduit à l'erreur. – ejgottl

+0

"lib-namespace" n'est pas un espace de noms légal, quel est le nom du symbole? –

Répondre

8

l'U be avant _ZN3lib-namespace12GetStatusStrEi dans la sortie nm montre que le symbole est non défini dans la bibliothèque.

Peut-être qu'il est défini dans le mauvais espace de nom: il semble que vous appelez dans lib-namepace mais vous pourriez définir dans un autre.

+0

Une suggestion sur comment obtenir le symbole défini? Le fichier cpp dans lequel il vit est définitivement en cours de compilation! Je – Clay

+0

ma réponse vient de modifier: peut-être que vous avez utilisé dans le mauvais espace de noms – PiedPiper

+0

Vous avez raison - il était un problème d'espace de noms – Clay

2

Cela fait un certain temps, mais si vous spécifiez une lib avec l'option -l, alors ne vous avez pas le sauter le préfixe lib?

(j'ai changé le nom de "lib-in-question.so" à "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 
+0

Mon makefile a que peu à droite: la bibliothèque est libzclocksupport mais la commande de liaison est -lzclocksupport – Clay

Questions connexes