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?
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
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 [...]
g++ -lmagic [...]
, si vous avez un lien symbolique nommé libmagic.so dans votre chemin de bibliothèqueLa 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
.
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.
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"
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.