Question

Je programme en FORTRAN et en C sur un SGI exécutant Irix 6.5, mais cela devrait s’appliquer à tous les systèmes de type Unix. Comment trouver la bibliothèque à relier à mon programme lorsque le symbole "texte non résolu" apparaît erreur de lien? Voici un exemple de ce que je vois dans l'éditeur de liens:

ld32: ERROR  33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a

Dois-je simplement savoir quelles bibliothèques sont requises ou existe-t-il un outil ou une commande pouvant m'aider à comprendre cela?

Était-ce utile?

La solution

Vous pouvez utiliser la commande nm pour répertorier les symboles dynamiques d'une bibliothèque partagée:

nm -D /lib/libc.so.6

et ensuite grep pour le symbole que vous recherchez. Omettez le -D pour les bibliothèques statiques. Vous pouvez l’utiliser dans une boucle ou avec xargs pour analyser plusieurs bibliothèques.

Je n'utilise généralement que Google (en supposant que le symbole provient d'une bibliothèque accessible au public).

Autres conseils

Utilisation de nm (comme dans La réponse de Robert Gamble ) est la réponse correcte à votre question. L'astuce consiste à savoir où chercher les bibliothèques. Que fait votre programme? S'il y a beaucoup de calculs numériques, il est probable que vous devriez créer un lien avec des bibliothèques de mathématiques (comme LAPACK ou BLAS) et que vous souhaitiez peut-être commencer à y chercher. La recherche sur le Web peut également être utile - j'ai tapé "ortho2". dans mon moteur de recherche préféré et ceci la documentation qui suggère que cela se trouve dans libfgl.a

Notez que lorsque vous effectuez une recherche, vous devriez probablement omettre le trait de soulignement final: il est généralement ajouté au nom de la routine par le compilateur.

J'ai résisté à la tentation d'ajouter ceci à la réponse de Robert Gamble - considérez cela comme un complément.

Ne vous contentez pas de supposer que "toute correspondance" convient à une utilisation. Il y avait un cas dans une autre question SO où un morceau de code avait été déplacé de Windows vers Unix et le code Windows utilisé getch () pour lire un seul caractère à partir de l'entrée. L'utilisateur a suivi un processus analogue à celui-ci et a trouvé getch () sous Unix dans la bibliothèque curses . Ainsi, l’utilisateur lié à la bibliothèque curses se demandait pourquoi le noyau de code était vidé. Le problème, c'est que getch () réellement utilisé suppose que l'initialisation correcte a été effectuée et que l'initialisation appropriée n'a pas été effectuée. En fait, ce n’était probablement pas la routine nécessaire.

Sous Solaris, nm contient des options vous indiquant le nom de la bibliothèque et même le fichier objet de la bibliothèque contenant le symbole (il s'agit de -r pour le nom de la bibliothèque. et -R pour l’objet dans la bibliothèque).

Attention aussi aux noms mutilés en C ++. L'exemple ortho2 n'est clairement pas mutilé en C ++.

S'il s'agit d'une fonction standard, comme ortho2, la page de manuel vous indiquera la bibliothèque dans laquelle elle se trouve.

J'ai un petit script lookfor. Entrez lookfor func_name

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top