2008-12-03 6 views
150

Je tente de lier une application avec g ++ sur ce système Debian Squeeze. ld se plaint, il ne peut pas 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.ld ne peut pas trouver une bibliothèque existante

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, existe libmagic:

$ 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 plus ce problème, et ce pourrait avoir tort? Est-ce que je fais quelque chose de complètement stupide?

Répondre

138

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

Un hack rapide est de créer un lien symbolique libmagic.so.1-libmagic.so

+3

qui fonctionne, je suis un peu perplexes qu'il nommerait le fichier d'une manière complètement inutile par défaut - pouvez-vous fournir une idée pourquoi il ferait ceci par défaut? – maxpenguin

+0

Il s'agit probablement d'une mauvaise configuration du script d'installation. – grepsedawk

+5

Le fichier 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 créer un lien vers celle-ci, 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

4

Si je ne me trompe mal libmagic ou -lmagic n'est pas la même bibliothèque que 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" 
57

Comme on vient 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 faire:

  • g++ -l:libmagic.so.1 [...]
  • ou: g++ -lmagic [...], si vous avez un lien symbolique nommé libmagic.so dans votre chemin libs
+0

Ou en résumé, supprimez le préfixe 'lib' lorsque vous liez à lui lorsque vous utilisez' -l'. '-llibmagic' devrait être' -lmagic'. – phyatt

30

Il est la convention de Debian pour 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 nom de la bibliothèque est libmagic.so.1, c'est la chaîne qui est incorporée dans l'exécutable de sorte que le fichier est chargé lorsque l'exécutable est exécuté.

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

Voir Diego E. Pettenò: Linkers and names pour plus de détails sur la façon dont tout cela fonctionne sur Linux.


En résumé, vous devriez apt-get install libmagic-dev. Cela vous donnera non seulement libmagic.so mais aussi d'autres fichiers nécessaires pour la compilation comme /usr/include/magic.h.

6

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é comme libltdl.so.7 et n'a pas été trouvé comme un simple -lltdl dans la marque.

+0

il n'a pas résolu l'erreur ** ne peut pas bien -LGL **. pourriez-vous donner plus d'informations sur ce que fait libtool et comment il résout les problèmes de bibliothèque? –

1

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

+4

Sûrement vous ne souffrez pas du même bug de script que maxpenguin en 2008. – Sophit

+0

il a résolu mon problème. Pourriez-vous s'il vous plaît donner plus d'informations sur ce que c'est. et comment il résout ce problème? (Je veux dire: libgl1-mesa-dev). Merci –

2

Comme mentionné ci-dessus l'éditeur de liens recherche libmagic.so, mais vous avez seulement libmagic.so.1.

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

ldconfig -v 

Pour vérifier que vous pouvez exécuter:

$ ldconfig -p | grep libmagic 
Questions connexes