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?
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.
Il y a deux façons d'y parvenir:
-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.
Devrait-ce être LIBRARY_PATH
au lieu de LD_LIBRARY_PATH
. gcc vérifie LIBRARY_PATH
qui peut être vu avec -v
option