Utiliser des bibliothèques partagées dans / usr / local / lib

59

J'ai construit des bibliothèques à partir de sources, et les fichiers suivants make installsont dans/usr/local/lib

Par exemple, dans mon cas, j'ai le fichier libodb-2.2.soqui 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.

Stéphane Rolland
la source
Je vous suggère fortement de nouer de bonnes relations d'amitié avec votre débogueur
DDS
@DDS Je suggère que vous développiez un peu plus. Vous savez que c'est un site collaboratif ici. S'il vous plaît, indiquez la manière dont vous gdbauriez aidé à linkré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 assez gdb, et le chargement des librairies.
Stéphane Rolland
Désolé ... ce commentaire aurait dû être placé sur stackoverflow à la question d'un apprenant sur la programmation en C ... n'a tout simplement pas été vu: U & L
DDS
@DDS Vous débutez dans l’apprentissage de la programmation C ou dans l’apprentissage de la construction sous Linux? S'il vous plaît, soyez plus précis. Par exemple, je venais de Windows. Cela ne veut pas dire que je ne connais pas le C ++ ... j'ai tendance à penser que votre comportement critique n'est pas exact. Même si cela avait été SO, votre comportement va bientôt attirer l'attention des modérateurs. Soyez conscient de cela. Vous êtes sur un site COLLABORATIF, composé de programmeurs passionnés partageant des connaissances utiles. Pas quelque part la conception pour flatter votre ego. (Ne vous inquiétez pas, j'ai aussi été légèrement / raisonnablement critiqué quand j'ai commencé SO, et je pense que c'est une très bonne chose qui s'est passé).
Stéphane Rolland

Réponses:

59

Pour la session en cours, vous pouvez

export LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

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 en ldconfigtant 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.

Flup
la source
3
De la manpage pour ldd(1)« Dans le cas habituel, ldd invoque l'éditeur de liens dynamique standard (voir ld.so(8)) avec l' LD_TRACE_LOADED_OBJECTSensemble variable d'environnement 1, ce qui provoque l'éditeur de liens pour afficher les Cependant, les dépendances bibliothèque. Sachez que dans certaines circonstances, certaines versions de lddmai essayez d’obtenir les informations de dépendance en exécutant directement le programme. Par conséquent, vous ne devez jamais utiliser lddd’ exécutable non fiable , car cela pourrait entraîner l’exécution de code arbitraire. Une alternative plus sûre lorsque vous
utilisez
4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven
Nice one - je n'ai jamais rencontré objdump avant.
Flup
Selon cet article, cette réponse est canoniquement incorrecte et nuisible . Pour une approche correcte, l’utilisation de -Let -rpathlors 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.
Cliff Armstrong
37

Si vous avez déjà exécuté ldconfigla bibliothèque, continuez à lire. Sinon, lisez d'abord sur ldconfig .

/usr/local/libpeut ne pas être dans le chemin de la bibliothèque utilisé par ldconfig. Vous pouvez simplement faire ceci:

ldconfig /usr/local/lib

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.drépertoire. Si c'est le cas, ajoutez un fichier (appelez-le "usr-local.conf", ou autre), et mettez-y une ligne:

/usr/local/lib

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.

boucle d'or
la source
3
J'ai ajouté un fichier custom.conf à /etc/ld.so.conf.dsudoed ldconfig pour le prendre en compte et mon exécutable peut démarrer maintenant.
Stephane Rolland