ld ne peut pas trouver une bibliothèque existante

Je tente de lier une application avec g ++ sur ce système lenny Debian. ld se plaint de ne pas trouver de librairies spécifiées. L’exemple spécifique ici est ImageMagick, mais j’ai aussi des problèmes similaires avec quelques autres bibliothèques.

J’appelle l’éditeur de liens 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 est-ce que je diagnostique plus loin ce problème et qu’est-ce qui pourrait être faux? Est-ce que je fais quelque chose de complètement stupide?

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

Un rapide hack est de libmagic.so.1 lien symbolique entre libmagic.so.1 et libmagic.so

Comme cela vient d’être formulé par grepsedawk, la réponse réside dans l’option -l de g++ , 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 libs

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 → … ).

Comme le soname de la bibliothèque est libmagic.so.1 , il s’agit de la chaîne qui est intégrée à l’exécutable, de sorte que le fichier chargé lors de l’exécution de l’exécutable est chargé.

Cependant, comme la bibliothèque est spécifiée comme -lmagic pour l’éditeur de liens, elle recherche libmagic.so , raison pour laquelle elle est nécessaire au développement.

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


En bref, vous devriez 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 .

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

 $ sudo apt-get install libtool 

Cela a résolu un problème avec ltdl pour moi, qui avait été installé sous le nom libltdl.so.7 et qui n’a pas été trouvé simplement -lltdl dans le make.

À moins que je ne me sois vraiment trompé, libmagic ou -lmagic n’est pas la même bibliothèque qu’ImageMagick. Vous déclarez que vous voulez ImageMagick.

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

Ex:

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

Comme mentionné ci-dessus, l’éditeur de liens recherche libmagic.so , mais vous n’avez que libmagic.so.1 .

Pour résoudre ce problème, effectuez simplement un cache de mise à jour.

 ldconfig -v 

Pour vérifier que vous pouvez exécuter:

 $ ldconfig -p | grep libmagic 

L’installation de libgl1-mesa-dev à partir du repository Ubuntu a résolu ce problème pour moi.