179 votes

ld ne peut pas trouver une bibliothèque existante

J'essaie de lier une application avec g++ sur ce système Debian Lenny. ld se plaint de ne pas pouvoir trouver les bibliothèques spécifiées. L'exemple spécifique ici est ImageMagick, mais j'ai des problèmes similaires avec quelques autres bibliothèques aussi.

J'appelle le linker avec :

g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic

ld se plaint :

/usr/bin/ld: cannot find -lmagic

Cependant, libmagic existe :

$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0

Comment puis-je diagnostiquer ce problème de manière plus approfondie, et qu'est-ce qui pourrait clocher ? Est-ce que je fais quelque chose de complètement stupide ?

181voto

grepsedawk Points 3413

Le problème est que l'éditeur de liens cherche libmagic.so mais vous n'avez que libmagic.so.1

Une astuce rapide consiste à faire un lien symbolique libmagic.so.1 a libmagic.so

3 votes

Qui fonctionne, je suis un peu perplexe sur le fait qu'il nomme le fichier d'une manière complètement inutile par défaut - pouvez-vous fournir une idée de la raison pour laquelle il ferait cela par défaut ?

0 votes

Le plus probable est une mauvaise configuration de l'installateur script.

7 votes

Le fichier foo.so.1 est également un lien symbolique vers foo.so.1.0.0. De cette façon, vous pouvez avoir plusieurs versions d'une bibliothèque dans votre système, et si une application a besoin d'une version spécifique, elle peut s'y lier, alors qu'en général, la plus récente est choisie par lien symbolique. Je ne sais pas pourquoi ce lien symbolique était absent.

70voto

Piotr Lesnicki Points 4169

Comme vient de le formuler grepsedawk, la réponse se trouve dans l'élément suivant -l option de g++ en appelant ld . Si vous regardez la page de manuel de cette commande, vous pouvez soit faire :

  • g++ -l:libmagic.so.1 [...]
  • ou : g++ -lmagic [...] si vous avez un lien symbolique nommé libmagic.so dans votre chemin des librairies.

0 votes

Ou en résumé, supprimez le lib lors de l'établissement d'un lien vers celui-ci en utilisant -l . -llibmagic devrait être -lmagic .

35voto

ephemient Points 87003

C'est la convention Debian de séparer les bibliothÃ?ques partagées dans leurs composants d'exécution ( libmagic1: /usr/lib/libmagic.so.1 libmagic.so.1.0.0 ) et leurs composants de développement ( libmagic-dev: /usr/lib/libmagic.so … ).

Parce que le nom de la bibliothèque est libmagic.so.1 C'est la chaîne de caractères qui est incorporée dans l'exécutable et c'est donc le fichier qui est chargé lorsque l'exécutable est exécuté.

Cependant, comme la bibliothèque est spécifiée comme -lmagic à l'éditeur de liens, il recherche libmagic.so C'est pourquoi elle est nécessaire au développement.

Voir Diego E. Pettenò : Linkers et noms pour plus de détails sur la façon dont tout cela fonctionne sous Linux.


En bref, vous devez apt-get install libmagic-dev . Cela vous donnera non seulement libmagic.so mais aussi d'autres fichiers nécessaires à la compilation comme /usr/include/magic.h .

10voto

Mr Ed Points 2068

Dans Ubuntu, vous pouvez installer libtool qui résout automatiquement les bibliothèques.

$ sudo apt-get install libtool

Cela a permis de résoudre un problème avec ltdl pour moi, qui avait été installé en tant que libltdl.so.7 et n'a pas été trouvé aussi simplement -lltdl dans la fabrication.

0 votes

Cela n'a pas résolu l'erreur ne peut pas aller bien -LGL . pourriez-vous donner plus d'informations sur ce que fait libtool et comment il résout les problèmes de bibliothèque ?

4voto

Brian Gianforcaro Points 11985

A moins que je ne me trompe lourdement libmagic o -lmagic n'est pas la même bibliothèque que ImageMagick. Vous déclarez que vous voulez ImageMagick.

ImageMagick est livré avec un utilitaire permettant de fournir toutes les options appropriées au compilateur.

Ex :

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X