web-dev-qa-db-fra.com

ld ne peut pas trouver une bibliothèque existante

Je tente de lier une application avec g ++ sur ce système Debian Lenny. ld se plaint de ne pas trouver les bibliothèques spécifiées. L'exemple spécifique ici est ImageMagick, mais j'ai également 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 puis-je diagnostiquer ce problème plus avant, et ce qui pourrait être le problème? Est-ce que je fais quelque chose de complètement stupide?

162
maxpenguin

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

Un hack rapide consiste à faire un lien symbolique libmagic.so.1 vers libmagic.so

152
grepsedawk

Comme vient de le formuler 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 de bibliothèque
66
Piotr Lesnicki

La convention Debian consiste à séparer les bibliothèques partagées en 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 nom de fichier de la bibliothèque est libmagic.so.1, il s'agit de la chaîne incorporée dans l'exécutable, de sorte que le fichier chargé lors de l'exécution de l'exécutable.

Toutefois, comme la bibliothèque est spécifiée sous la forme -lmagic dans l'éditeur de liens, elle recherche libmagic.so, ce qui explique pourquoi elle est nécessaire au développement.

Voir Diego E. Pettenò: Liens et noms pour des détails sur la manière dont tout cela fonctionne sous Linux.


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

31
ephemient

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

$ Sudo apt-get install libtool

Cela a résolu un problème avec ltdl pour moi, qui avait été installé en tant que libltdl.so.7 et qui n'a pas été trouvé sous la forme simplement -lltdl de la marque.

7
Mr Ed

Sauf erreur de ma part, libmagic ou -lmagic n'est pas la même bibliothèque qu'ImageMagick. Vous déclarez que vous voulez ImageMagick.

ImageMagick est fourni avec un utilitaire fournissant toutes les options appropriées au compilateur.

Ex:

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

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, vous pouvez exécuter:

$ ldconfig -p | grep libmagic

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

1
kirenpillay