GNU/Linux >> Tutoriels Linux >  >> Linux

usr/bin/ld :impossible de trouver -l<nameOfTheLibrary>

Pour comprendre ce que l'éditeur de liens recherche, exécutez-le en mode verbeux.

Par exemple, j'ai rencontré ce problème en essayant de compiler MySQL avec le support ZLIB. Je recevais une erreur comme celle-ci lors de la compilation :

/usr/bin/ld: cannot find -lzlib

J'ai fait quelques recherches sur Google et j'ai continué à rencontrer différents problèmes du même genre où les gens disaient de s'assurer que le fichier .so existe réellement et si ce n'est pas le cas, créez un lien symbolique vers le fichier versionné, par exemple, zlib. so.1.2.8. Mais, quand j'ai vérifié, zlib.so existait. Alors, j'ai pensé que ça ne pouvait sûrement pas être le problème.

Je suis tombé sur un autre post sur Internet qui suggérait d'exécuter make avec LD_DEBUG=all :

LD_DEBUG=all make

Bien que j'aie obtenu une tonne de résultats de débogage, cela n'a pas été vraiment utile. Cela a ajouté plus de confusion qu'autre chose. Alors, j'étais sur le point d'abandonner.

Ensuite, j'ai eu une épiphanie. J'ai pensé à vérifier le texte d'aide de la commande ld :

ld --help

À partir de là, j'ai compris comment exécuter ld en mode verbeux (imaginez cela) :

ld -lzlib --verbose

Voici le résultat que j'ai obtenu :

==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
attempt to open /usr/local/lib64/libzlib.so failed
attempt to open /usr/local/lib64/libzlib.a failed
attempt to open /lib64/libzlib.so failed
attempt to open /lib64/libzlib.a failed
attempt to open /usr/lib64/libzlib.so failed
attempt to open /usr/lib64/libzlib.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
attempt to open /usr/local/lib/libzlib.so failed
attempt to open /usr/local/lib/libzlib.a failed
attempt to open /lib/libzlib.so failed
attempt to open /lib/libzlib.a failed
attempt to open /usr/lib/libzlib.so failed
attempt to open /usr/lib/libzlib.a failed
/usr/bin/ld.bfd.real: cannot find -lzlib

Ding, ding, ding...

Donc, pour enfin le réparer afin que je puisse compiler MySQL avec ma propre version de ZLIB (plutôt que la version fournie) :

sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so

Voila !


Si le nom de votre bibliothèque est, dites libxyz.so et il est situé sur le chemin, dites :

/home/user/myDir

puis de le lier à votre programme :

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog

Il ne semble pas y avoir de réponse qui résout le problème très courant des débutants consistant à ne pas installer la bibliothèque requise en premier lieu.

Sur les plateformes Debianish, si libfoo est manquant, vous pouvez fréquemment l'installer avec quelque chose comme

apt-get install libfoo-dev

Le -dev La version du package est requise pour les travaux de développement, même les travaux de développement triviaux tels que la compilation du code source à lier à la bibliothèque.

Le nom du package nécessitera parfois quelques décorations (libfoo0-dev ? foo-dev sans le lib préfixe? etc), ou vous pouvez simplement utiliser la recherche de packages de votre distribution pour savoir précisément quels packages fournissent un fichier particulier.

(S'il y en a plusieurs, vous devrez découvrir quelles sont leurs différences. Choisir le plus cool ou le plus populaire est un raccourci courant, mais pas une procédure acceptable pour tout travail de développement sérieux.)

Pour les autres architectures (notamment RPM), des procédures similaires s'appliquent, bien que les détails soient différents.


Linux
  1. /usr/bin Vs /usr/local/bin Sous Linux ?

  2. Linux – Fusionner /usr/bin et /usr/sbin dans /bin (gnu/linux) ?

  3. ld ne peut pas trouver une bibliothèque existante

  4. Installer les binaires dans /bin, /sbin, /usr/bin et /usr/sbin, interactions avec --prefix et DESTDIR

  5. Erreur de compilation OCaml :/usr/bin/ld :impossible de trouver -lstr

/usr/bin/ld :impossible de trouver -lpython2.7

Impossible de trouver l'erreur de bibliothèque libcrypto

gcc - /usr/bin/ld erreur :impossible de trouver <library> dans /usr/local/lib bien que ldconfig le liste et le chemin ajouté à ld.so.conf

Différence entre /bin et /usr/bin

Déplacement du contenu de /bin vers /usr/bin, possible d'annuler ?

Qu'est-ce que /usr/bin/[ ?