ld ne trouve pas de bibliothèque existante

169

J'essaye 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 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 diagnostiquer davantage ce problème et qu'est-ce qui pourrait ne pas fonctionner? Est-ce que je fais quelque chose de complètement stupide?

maxpenguin
la source

Réponses:

158

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

Un hack rapide consiste à créer un lien symbolique libmagic.so.1verslibmagic.so

grepsedawk
la source
3
cela fonctionne, je suis un peu perplexe quant au fait que cela nomme le fichier de manière totalement inutile par défaut - pouvez-vous nous expliquer pourquoi il le ferait par défaut?
maxpenguin
5
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 en a besoin, 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 manquait.
Svante
46
libmagic.so.1 est le soname, utilisé par l'éditeur de liens dynamique; libmagic.so est utilisé par l'éditeur de liens et est généralement associé aux en-têtes du paquet -dev. Le lien symbolique est peut-être manquant car le paquet -dev n'a pas été installé.
CesarB
13
J'ai eu le même problème ... au lieu de faire le "hack" j'ai installé la version "* -devel" et cela a corrigé la compilation.
Trevor Boyd Smith
4
Comment créer un lien symbolique entre libmagic.so.1 et libmagic.so? Et où trouver ces packages "devel"
Noir
69

Comme vient d'être formulé par grepsedawk, la réponse réside dans l' -loption de g++, appeler 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 le chemin de votre bibliothèque
Piotr Lesnicki
la source
Ou en résumé, supprimez le libpréfixe lors de la liaison lors de l'utilisation -l. -llibmagicdevrait être -lmagic.
phyatt
31

C'est la convention Debian de 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 → …).

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

Cependant, comme la bibliothèque est spécifiée comme -lmagicl'éditeur de liens, elle recherche libmagic.so, c'est pourquoi elle est nécessaire pour le développement.

Voir Diego E. Pettenò: Lieurs et 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.somais également d'autres fichiers nécessaires à la compilation, comme /usr/include/magic.h.

éphémère
la source
7

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

$ sudo apt-get install libtool

Cela a résolu un problème avec ltdlpour moi, qui avait été installé comme libltdl.so.7et n'a pas été trouvé aussi simplement -lltdldans la marque.

Monsieur Ed
la source
il n'a pas résolu l'erreur ne peut pas bien -LGL . pourriez-vous s'il vous plaît donner plus d'informations sur ce que fait libtool et comment il résout les problèmes de bibliothèque?
Shahryar Saljoughi
4

Sauf si je me trompe gravement libmagicou si ce -lmagicn'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"
Brian Gianforcaro
la source
4

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
Miguel Ignacio Iglesias
la source
1

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

Kirenpillay
la source
5
Vous ne souffrez sûrement pas du même bogue de script que maxpenguin en 2008.
Sophit
cela a résolu mon problème. pourriez-vous s'il vous plaît donner plus d'informations sur ce que c'est. et comment cela résout ce problème? (je veux dire: libgl1-mesa-dev). merci
Shahryar Saljoughi