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?
linux
gcc
linker
shared-libraries
shared-objects
maxpenguin
la source
la source
Comme vient d'être formulé par grepsedawk, la réponse réside dans l'
-l
option deg++
, appelerld
. 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 le chemin de votre bibliothèquela source
lib
préfixe lors de la liaison lors de l'utilisation-l
.-llibmagic
devrait être-lmagic
.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
-lmagic
l'éditeur de liens, elle recherchelibmagic.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.so
mais également d'autres fichiers nécessaires à la compilation, comme/usr/include/magic.h
.la source
Dans Ubuntu, vous pouvez installer
libtool
ce qui résout les bibliothèques automatiquement.Cela a résolu un problème avec
ltdl
pour moi, qui avait été installé commelibltdl.so.7
et n'a pas été trouvé aussi simplement-lltdl
dans la marque.la source
Sauf si je me trompe gravement
libmagic
ou si ce-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:
la source
Comme mentionné ci-dessus, l'éditeur de liens recherche
libmagic.so
, mais vous n'avez quelibmagic.so.1
.Pour résoudre ce problème, effectuez simplement un cache de mise à jour.
Pour vérifier que vous pouvez exécuter:
la source
L'installation de libgl1-mesa-dev à partir du repo Ubuntu a résolu ce problème pour moi.
la source