41 votes

Pourquoi dois-je définir LD_LIBRARY_PATH avec une exportation à chaque fois que je lance mon application ?

J'ai un code qui utilise des bibliothèques partagées (code c sur gcc). Lors de la compilation, je dois définir explicitement les répertoires include et library en utilisant -I et -L, car ils ne sont pas dans les emplacements standards. Lorsque j'essaie d'exécuter le code, j'obtiens l'erreur suivante :

./sync_test 
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory

Cependant, si vous faites ce qui suit, tout fonctionne parfaitement :

export LD_LIBRARY_PATH="/path/to/library/"
./sync_test

Maintenant, la partie étrange est que cela ne fonctionne qu'une fois. Si j'essaie d'exécuter sync_test à nouveau, j'obtiens la même erreur, à moins que je n'exécute d'abord la commande d'exportation. J'ai essayé d'ajouter ce qui suit à mon .bashrc, mais cela n'a fait aucune différence :

LD_LIBRARY_PATH="/path/to/library/"

44voto

sigjuice Points 9166

Vous devez éviter de définir LD_LIBRARY_PATH dans votre .bashrc. Voir " Why LD_LIBRARY_PATH is bad " pour plus d'informations.

Utiliser l'option de l'éditeur de liens -rpath lors de l'édition de liens afin que l'éditeur de liens dynamiques sache où trouver libsync.so pendant l'exécution.

gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test

EDIT :

Un autre moyen serait d'utiliser un wrapper comme celui-ci

#!/bin/bash

LD_LIBRARY_PATH=/path/to/library sync_test "$@"

Si sync_test démarre d'autres programmes, ils peuvent finir par utiliser les librairies dans /path/to/library, ce qui n'est pas forcément voulu.

42voto

user83591 Points 3857

Utilisez

export LD_LIBRARY_PATH="/path/to/library/"

dans votre .bashrc sinon, il ne sera disponible que pour bash et pas pour les programmes que vous démarrez.

Essayez -R/path/to/library/ lors de l'édition de liens, le programme se trouvera dans ce répertoire et vous n'aurez pas besoin de définir de variables d'environnement.

EDIT : On dirait que -R est Solaris seulement, et vous êtes sur Linux.

Une autre façon de procéder serait d'ajouter le chemin d'accès à /etc/ld.so.conf et exécuter ldconfig . Notez qu'il s'agit d'un changement global qui s'appliquera à tous les binaires liés dynamiquement.

10voto

bedwyr Points 3759

Avez-vous "exporté" dans votre .bashrc ?

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"

10voto

Vous pouvez mettre tout ça sur une seule ligne :

LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test

Cela devrait rendre les choses un peu plus faciles, même si cela ne change rien de fondamental.

4voto

fgp Points 1949

Au lieu de modifier le chemin de recherche de la bibliothèque au moment de l'exécution avec LD_LIBRARY_PATH, vous pouvez l'intégrer dans le binaire lui-même avec la fonction rpath . Si vous liez avec GCC en ajoutant -Wl,-rpath,<libdir> devrait faire l'affaire, si vous liez avec ld c'est juste -rpath <libdir> .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X