J'ai un exécutable qui doit être lié libtest.so
dynamiquement, alors je les mets dans le même répertoire, puis:
cd path_to_dir
./binary
Mais j'ai ceci:
error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
Comment peut-il être incapable de trouver libtest.so
ce qui se trouve déjà dans le même répertoire que l'exécutable lui-même?
linux
autoloader
linuxer
la source
la source
echo $LD_LIBRARY_PATH
est vide sur ma machine :(:
), pas un point-virgule.Bien que vous puissiez définir LD_LIBRARY_PATH pour laisser l’éditeur de liens dynamique savoir où regarder, de meilleures options existent. Vous pouvez placer votre bibliothèque partagée à l’un des emplacements standard, voir
/etc/ld.so.conf
(sous Linux) et/usr/bin/crle
(sous Solaris) pour obtenir la liste de ces emplacements.Vous pouvez passer
-R <path>
à l'éditeur de liens lors de la construction de votre binaire, ce qui s'ajoutera<path>
à la liste des répertoires analysés pour votre bibliothèque partagée. Voici un exemple. Tout d'abord, montrant le problème:libtest.h:
libtest.c:
Bonjour c:
Makefile (les onglets doivent être utilisés):
Courons le:
Comment le réparer? Ajouter
-R <path>
aux drapeaux de l'éditeur de liens (ici, par paramètreLDFLAGS
).En regardant le binaire, vous pouvez voir qu'il a besoin de
libtest.so.0
:Le binaire cherchera ses bibliothèques, en dehors des emplacements standard, dans le répertoire spécifié:
Si vous voulez que le fichier binaire regarde dans le répertoire en cours, vous pouvez définir le RPATH sur
$ORIGIN
. C'est un peu délicat, car vous devez vous assurer que le signe dollar n'est pas interprété par make. Voici une façon de le faire:la source
make
, par exemple lors d'un appel manuelg++
, essayez-Wl,-rpath='$ORIGIN'
(notez les guillemets simples) d'empêcher le$ORIGIN
développement d'une chaîne vide.Pour charger les objets partagés à partir du même répertoire que votre exécutable, exécutez simplement:
Remarque: Cela ne modifiera pas la variable LD_LIBRARY_PATH de votre système. Le changement n'affecte que ceci et seulement cela l'exécution de votre programme.
la source
Pour ceux qui se battent encore sans réponse, j'en ai trouvé une moi-même avec la suggestion suivante:
Vous pouvez essayer de mettre à jour le fichier ld.so.cache en utilisant:
sudo ldconfig -v
Travaillé pour moi
la source
Pour toute personne utilisant CMake pour sa construction, vous pouvez définir les paramètres
CMAKE_EXE_LINKER_FLAGS
suivants:Cela propagera correctement les indicateurs de l'éditeur de liens pour tous les types de construction (par exemple, Debug, Release, etc.) afin de rechercher d'abord les fichiers .so dans le répertoire de travail en cours.
la source
L'éditeur de liens dynamique décidera où chercher les bibliothèques. Dans le cas de Linux, l'éditeur de liens dynamique est généralement
GNU ld.so
(ou une alternative qui se comportera généralement de la même manière pour des raisons de compatibilité).Pour citer des citations sur Wikipedia:
Source: https://en.wikipedia.org/wiki/Rpath
la source