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



gcc static library (5)

Au lieu de surcharger le chemin de recherche de la bibliothèque au moment de l'exécution avec LD_LIBRARY_PATH, vous pouvez le faire dans le binaire lui-même avec 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> .

J'ai du code qui utilise des librairies 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 endroits 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, faites ce qui suit, tout fonctionne bien:

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

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

LD_LIBRARY_PATH="/path/to/library/"

Avez-vous «exporté» dans votre .bashrc?

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

Utilisation

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

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

Essayez -R/path/to/library/ drapeau lorsque vous liez, cela fera apparaître le programme 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 alternative serait d'ajouter le chemin vers /etc/ld.so.conf et d'exécuter ldconfig . Notez qu'il s'agit d'une modification globale qui s'appliquera à tous les binaires liés dynamiquement.


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

Utilisez l'option de l'éditeur de liens -rpath lors de la liaison pour que l'éditeur de liens dynamique sache où trouver libsync.so pendant l'exécution.

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

MODIFIER:

Une autre façon serait d'utiliser un emballage comme celui-ci

#!/bin/bash

LD_LIBRARY_PATH=/path/to/library sync_test "[email protected]"

Si sync_test démarre d'autres programmes, ils peuvent utiliser les librairies dans /path/to/library qui peuvent ou non être utilisées.


Vous pouvez simplement mettre tout cela sur une ligne:

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

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





ld