web-dev-qa-db-fra.com

Comment spécifier un chemin de bibliothèque partagée autre que par défaut dans GCC Linux? Obtenir "erreur lors du chargement des bibliothèques partagées" lors de l'exécution

Il y a un ordinateur portable sur lequel je n'ai pas de privilège root.

j'ai une bibliothèque installée sur la machine en utilisant configure --prefix=$HOME/.usr.

après cela, j'ai ces fichiers dans ~/.usr/lib:

libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a

quand je compile un programme qui appelle une fonction fournie par la bibliothèque avec cette commande: gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX

xxx.out a été généré sans avertissement, mais lorsque je l'ai exécuté, une erreur comme celle-ci a été générée:

./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory , bien que libXX.so.16 y réside.

mon hypothèse sans indice est que ~/.usr/lib n'a pas été recherché lorsque xxx.out est appelé. mais que puis-je faire pour spécifier le chemin de .so, afin que xxx.out puisse y chercher un fichier .so?

Un ajout est quand je nourris -static à gcc, une autre erreur se produit comme ceci:

undefined reference to `function_proviced_by_the_very_librar'

Il semble .so n'a pas d'importance même si -L et -l sont donnés à gcc. que dois-je faire pour construire un fichier exe utilisable avec cette bibliothèque?


Pour les autres personnes qui ont la même question que moi

J'ai trouvé n article utile à tldp à ce sujet.

Il introduit la bibliothèque chargée statique/partagée/dynamique, ainsi que quelques exemples de code pour les utiliser.

54
Jokester

Il y a deux façons d'y parvenir:

  • Utilisation -rpath option de l'éditeur de liens:

gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib

  • Utilisation LD_LIBRARY_PATH variable d’environnement - insérez cette ligne dans votre ~/.bashrc fichier:

    export LD_LIBRARY_PATH=/home/user/.usr/lib

Cela fonctionnera même pour des fichiers binaires pré-générés. Vous pourrez par exemple télécharger des packages à partir de debian.org , décompresser les fichiers binaires et les bibliothèques partagées dans votre répertoire personnel et les lancer sans recompiler.

Pour un test rapide, vous pouvez aussi faire (au moins en bash):

LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out

ce qui a l'avantage de ne pas changer votre chemin d'accès à la bibliothèque pour tout le reste.

93
pelya

Devrait-ce être LIBRARY_PATH au lieu de LD_LIBRARY_PATH. gcc vérifie LIBRARY_PATH qui peut être vu avec -v option

4
Ashit