J'essaie de compiler mon programme et il renvoie cette erreur:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
dans mon makefile j'utilise la commande g++
et le lien vers ma bibliothèque qui est un lien symbolique vers ma bibliothèque située sur un autre répertoire.
Y a-t-il une option à ajouter pour le faire fonctionner s'il vous plaît?
-l
commutateur (par exemple. Libpthread.so vous êtes déjà en liaison avec).Réponses:
Si le nom de votre bibliothèque est say
libxyz.so
et qu'il se trouve sur le chemin, dites:puis pour le lier à votre programme:
la source
Pour comprendre ce que l'éditeur de liens recherche, exécutez-le en mode détaillé.
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:
J'ai fait un peu de Googl et j'ai continué à rencontrer différents problèmes du même genre où les gens disaient pour s'assurer que le fichier .so existe réellement et si ce n'est pas le cas, puis créer un lien symbolique vers le fichier versionné, par exemple, zlib. donc.1.2.8. Mais, quand j'ai vérifié, zlib.so DID existait. Donc, je pensais que ça ne pouvait pas être le problème.
Je suis tombé sur un autre post sur les Internets qui a suggéré d'exécuter make avec LD_DEBUG = all:
Bien que j'aie eu une tonne de sortie de débogage, ce n'était pas vraiment utile. Cela a ajouté plus de confusion qu'autre chose. J'étais sur le point d'abandonner.
Ensuite, j'ai eu une révélation. J'ai pensé à vérifier le texte d'aide de la commande ld:
À partir de cela, j'ai compris comment exécuter ld en mode verbeux (imaginez cela):
Voici la sortie que j'ai obtenue:
Ding, ding, ding ...
Donc, pour enfin le corriger afin que je puisse compiler MySQL avec ma propre version de ZLIB (plutôt que la version fournie):
Voila!
la source
-Xlinker --verbose
aux arguments de la ligne de commande de gcc pour qu'il passe cette option à ld.-Wl,-Bstatic
. Cela limite la recherche aux fichiers .a uniquement. L'option verbeuse l'a clairement montré. Une fois que j'ai supprimé-Wl,-Bstatic
les bibliothèques partagées, les recherches ont également été effectuées.-Wl,--verbose
et passe--verbose
à l'éditeur de liens.-Wl,--verbose
pour passer verbeux à l'éditeur de liens.Il ne semble pas y avoir de réponse qui résout le problème très courant des débutants de ne pas installer la bibliothèque requise en premier lieu.
Sur les plateformes Debianish, s'il
libfoo
est manquant, vous pouvez fréquemment l'installer avec quelque chose commeLa
-dev
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 lelib
préfixe? Etc), ou vous pouvez simplement utiliser la recherche de package de votre distribution pour savoir précisément quels packages fournissent un fichier particulier.(S'il y en a plus d'un, vous devrez découvrir leurs différences. Choisir le plus cool ou le plus populaire est un raccourci commun, mais pas une procédure acceptable pour tout travail de développement sérieux.)
Pour d'autres architectures (notamment RPM), des procédures similaires s'appliquent, bien que les détails soient différents.
la source
apt-get install libperl-dev
trié pour moi. Merci :)yum install openssl-devel
résolu le problème.Compiler le temps
Lorsque g ++ le dit
cannot find -l<nameOfTheLibrary>
, cela signifie que g ++ a recherché le fichierlib{nameOfTheLibrary}.so
, mais il ne l'a pas trouvé dans le chemin de recherche de la bibliothèque partagée, qui par défaut pointe vers/usr/lib
et/usr/local/lib
et ailleurs peut-être.Pour résoudre ce problème, vous devez fournir le fichier de bibliothèque (
lib{nameOfTheLibrary}.so
) dans ces chemins de recherche ou utiliser l'-L
option de commande.-L{path}
indique au g ++ (en faitld
) de trouver les fichiers de bibliothèque dans le chemin{path}
en plus des chemins par défaut.Exemple: en supposant que vous avez une bibliothèque sur
/home/taylor/libswift.so
et que vous souhaitez lier votre application à cette bibliothèque. Dans ce cas, vous devez fournir au g ++ les options suivantes:Remarque 1 : l'
-l
option obtient le nom de la bibliothèque sanslib
et.so
à ses début et fin.Remarque 2 : Dans certains cas, le nom du fichier de bibliothèque est suivi de sa version, par exemple
libswift.so.1.2
. Dans ces cas, g ++ ne peut pas non plus trouver le fichier de bibliothèque. Une solution simple pour résoudre ce problème consiste à créer un lien symbolique verslibswift.so.1.2
appelélibswift.so
.Durée
Lorsque vous liez votre application à une bibliothèque partagée, il est nécessaire que la bibliothèque reste disponible chaque fois que vous exécutez l'application. Lors de l'exécution, votre application (en fait un éditeur de liens dynamique) recherche ses bibliothèques dans
LD_LIBRARY_PATH
. C'est une variable d'environnement qui stocke une liste de chemins.Exemple: Dans notre
libswift.so
exemple, l'éditeur de liens dynamique ne peut pas trouverlibswift.so
dansLD_LIBRARY_PATH
(qui pointe vers des chemins de recherche par défaut). Pour résoudre le problème, vous devez ajouter cette variable avec le chemin d'accèslibswift.so
.la source
.so
fichiers/usr/lib
, mais il est devenu intéressant pour moi de savoir siexport
cela pourrait aider. Malgré le processus d'installation qui s'estmake
poursuivi plus longtemps, une autre erreur s'est produite. Cette fois, le.so.0
fichier n'a pas été trouvé, mais les deux fichiers.so
et se.so.0
trouvaient dans le répertoire où j'ai construit le package dépendant de la source. Pourriez-vous m'aider?Lors de la compilation avec
g++
via,make
définissezLIBRARY_PATH
s'il ne convient pas de modifier le Makefile avec l'-L
option. J'avais mis ma bibliothèque supplémentaire/opt/lib
alors j'ai fait:puis couru
make
pour une compilation et une liaison réussies.Pour exécuter le programme avec une bibliothèque partagée, définissez:
avant d'exécuter le programme.
la source
Tout d'abord, vous devez connaître la règle de dénomination de
lxxx
:lc
signifielibc.so
,lltdl
signifielibltdl.so
,lXtst
signifielibXts.so
.Donc, c'est
lib
+lib-name
+.so
Une fois que nous connaissons le nom, nous pouvons utiliser
locate
pour trouver le chemin de celxxx.so
fichier.Si vous ne le trouvez pas, vous devez l'installer par
yum
(j'utilise CentOS). Habituellement, vous avez ce fichier, mais il n'est pas lié au bon endroit.Reliez-le au bon endroit, généralement c'est
/lib64
ou/usr/lib64
$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/
Terminé!
réf: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
la source
locate
ne fonctionne que s'il est installé et fonctionne régulièrement. Une solution de contournement grossière consiste à s'exécuterfind
sur l'intégralité de votre disque, mais bien sûr, cela prendra du temps. Si vous vous trouvez à le faire fréquemment, envisagez d'installerlocate
juste pour réduire le coût (interactif, humain) de cette opération.Lorsque vous compilez votre programme, vous devez fournir le chemin d'accès à la bibliothèque; dans g ++, utilisez l'option -L:
la source
ccmake
pour que leMakefile
soit créé avec l'indicateur lié? Je veux lier mon-lARToolkitPlus
drapeau à un chemin.Cette erreur peut également se produire si le lien symbolique est vers une bibliothèque dynamique, .so, mais pour des raisons héritées
-static
apparaît parmi les indicateurs de lien. Si oui, essayez de le retirer.la source
Vérifiez l'emplacement de votre bibliothèque, par exemple lxxx.so:
S'il ne se trouve pas dans le
/usr/lib
dossier, tapez ceci:Terminé.
la source
Outre les réponses déjà données, il se peut également que le fichier * .so existe mais ne soit pas nommé correctement. Ou il se peut que le fichier * .so existe mais qu'il appartient à un autre utilisateur / racine.
Problème 1: nom incorrect
Si vous liez le fichier car
-l<nameOfLibrary>
le nom du fichier de bibliothèque DOIT être de la formelib<nameOfLibrary>
Si vous n'avez qu'un<nameOfLibrary>.so
fichier, renommez-le!Problème 2: mauvais propriétaire
Pour vérifier que ce n'est pas le problème - faites
Si le fichier appartient à root ou à un autre utilisateur, vous devez faire
la source
La bibliothèque que j'essayais de lier s'est avérée avoir un nom non standard (c'est-à-dire qu'elle n'était pas préfixée par «lib»), alors ils ont recommandé d'utiliser une commande comme celle-ci pour la compiler -
gcc test.c -Iinclude lib/cspice.a -lm
la source
Voici les informations Ubuntu de mon ordinateur portable.
J'utilise Locate pour trouver les fichiers .so pour boost_filesystem et boost_system
Liez ensuite les fichiers .so à / usr / lib et renommez-les en .so
Terminé! Le package R velocyto.R a été installé avec succès!
la source
J'ai rencontré le même message d'erreur.
J'ai construit le en
cmocka
tant queso
et essayé de le lier à mon exécutable. Mais seld
plaint toujours ci-dessous:Il s'avère qu'il y a 3 fichiers générés après la
cmocka
construction:1 et 2 sont des liens symboliques et seulement 3 est le vrai fichier.
J'ai seulement copié le 1 dans mon dossier de bibliothèque, où je n'ai
ld
pas trouvé le 3.Après avoir copié tous les 3,
ld
fonctionne.la source