J'ai construit des bibliothèques à partir de sources, et les fichiers suivants make install
sont dans/usr/local/lib
Par exemple, dans mon cas, j'ai le fichier libodb-2.2.so
qui se trouve dans ce répertoire.
Cependant, lorsque je lance l'exécutable lié libodb
, j'ai l'erreur suivante: erreur lors du chargement de bibliothèques partagées:libodb-2.2.so: cannont open shared object file: No such file or directory.
Est-ce que cela signifie que j'ai construit mon exécutable pas correctement? ou dois-je indiquer au système qu'il peut également y avoir des bibliothèques intéressantes dans le dossier /usr/local/lib
?
J'utilise Ubuntu 12.04, noyau Linux 3.2.0-38-generic.
gdb
auriez aidé àlink
résoudre un problème, par exemple. Je suis vraiment curieux. Au début, votre remarque ne me semble pas liée au problème. Mais je peux me tromper. En effet je ne sais pas assezgdb
, et le chargement des librairies.Réponses:
Pour la session en cours, vous pouvez
ou pour rendre le changement permanent , vous pouvez ajouter
/usr/local/lib
à/etc/ld.so.conf
(ou quelque chose qu'il comprend) et exécuter enldconfig
tant que root.Si vous rencontrez toujours des problèmes, l'exécution
ldd [executable name]
vous montrera les bibliothèques qu'il essaie de trouver et celles qui ne peuvent pas être trouvées.la source
man
page pourldd(1)
« Dans le cas habituel, ldd invoque l'éditeur de liens dynamique standard (voirld.so(8)
) avec l'LD_TRACE_LOADED_OBJECTS
ensemble variable d'environnement1
, ce qui provoque l'éditeur de liens pour afficher les Cependant, les dépendances bibliothèque. Sachez que dans certaines circonstances, certaines versions deldd
mai essayez d’obtenir les informations de dépendance en exécutant directement le programme. Par conséquent, vous ne devez jamais utiliserldd
d’ exécutable non fiable , car cela pourrait entraîner l’exécution de code arbitraire. Une alternative plus sûre lorsque vous$ objdump -p /path/to/program | grep NEEDED
"-L
et-rpath
lors de la compilation pour définir le chemin de recherche de liaison et le chemin de recherche d’exécution pour les bibliothèques est la méthode correcte, comme indiqué dans cette question et cette réponse.Si vous avez déjà exécuté
ldconfig
la bibliothèque, continuez à lire. Sinon, lisez d'abord sur ldconfig ./usr/local/lib
peut ne pas être dans le chemin de la bibliothèque utilisé par ldconfig. Vous pouvez simplement faire ceci:Et les choses devraient être ajoutées au cache de l'éditeur de liens, mais il est probablement préférable d'ajouter le chemin correctement. Assurez-vous d'avoir un
/etc/ld.so.conf.d
répertoire. Si c'est le cas, ajoutez un fichier (appelez-le "usr-local.conf", ou autre), et mettez-y une ligne:Maintenant, cours
ldconfig
. Si vous ne disposez pas du répertoire ld.so.conf.d, vous devriez avoir un/etc/ld.so.conf
fichier et vous pouvez ajouter cette ligne à la fin de celui-ci.la source
/etc/ld.so.conf.d
sudoed ldconfig pour le prendre en compte et mon exécutable peut démarrer maintenant.