Votre bibliothèque est une bibliothèque dynamique. Vous devez indiquer au système d'exploitation où il peut la localiser au moment de l'exécution.
Pour ce faire, nous devrons suivre ces étapes simples :
(1 ) Trouvez où se trouve la bibliothèque si vous ne la connaissez pas.
sudo find / -name the_name_of_the_file.so
(2) Vérifiez l'existence de la variable d'environnement de chemin de bibliothèque dynamique (LD_LIBRARY_PATH
)
$ echo $LD_LIBRARY_PATH
s'il n'y a rien à afficher, ajoutez une valeur de chemin par défaut (ou pas si vous le souhaitez)
$ LD_LIBRARY_PATH=/usr/local/lib
(3) Nous ajoutons le chemin souhaité, l'exportons et essayons l'application.
Notez que le chemin doit être le répertoire où le path.so.something
est.Donc si path.so.something
est en /my_library/path.so.something
ça devrait être :
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app
source :http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
Voici quelques solutions que vous pouvez essayer :
ldconfig
Comme AbiusX l'a souligné :si vous venez d'installer la bibliothèque, vous devrez peut-être simplement exécuter ldconfig.
sudo ldconfig
ldconfig crée les liens et le cache nécessaires vers les bibliothèques partagées les plus récentes trouvées dans les répertoires spécifiés sur la ligne de commande, dans le fichier /etc/ld.so.conf et dans les répertoires de confiance (/lib et /usr/lib).
Habituellement, votre gestionnaire de paquets s'en occupera lorsque vous installerez une nouvelle bibliothèque, mais pas toujours, et cela ne fera pas de mal d'exécuter ldconfig même si ce n'est pas votre problème.
Paquet de développement ou mauvaise version
Si cela ne fonctionne pas, je vérifierais également la suggestion de Paul et chercherais une version "-dev" de la bibliothèque. De nombreuses bibliothèques sont divisées en packages dev et non-dev. Vous pouvez utiliser cette commande pour le rechercher :
apt-cache search <libraryname>
Cela peut également aider si vous avez simplement installé la mauvaise version de la bibliothèque. Certaines bibliothèques sont publiées simultanément dans différentes versions, par exemple, Python.
Emplacement de la bibliothèque
Si vous êtes sûr que le bon paquet est installé et que ldconfig ne l'a pas trouvé, il se peut qu'il se trouve simplement dans un répertoire non standard. Par défaut, ldconfig regarde dans /lib
, /usr/lib
, et les répertoires répertoriés dans /etc/ld.so.conf
et $LD_LIBRARY_PATH
. Si votre bibliothèque est ailleurs, vous pouvez soit ajouter le répertoire sur sa propre ligne dans /etc/ld.so.conf
, ajoutez le chemin de la bibliothèque à $LD_LIBRARY_PATH
, ou déplacer la bibliothèque en /usr/lib
. Ensuite, exécutez ldconfig
.
Pour savoir où se trouve la bibliothèque, essayez ceci :
sudo find / -iname *libraryname*.so*
(Remplacer libraryname
avec le nom de votre bibliothèque)
Si vous passez par le $LD_LIBRARY_PATH
route, vous voudrez le mettre dans votre ~/.bashrc
fichier pour qu'il s'exécute à chaque fois que vous vous connectez :
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
Mettre à jour
Bien que ce que j'écris ci-dessous soit vrai en tant que réponse générale sur les bibliothèques partagées, je pense que la cause la plus fréquente de ce type de message est que vous avez installé un package, mais pas installé la version "-dev" de ce package.
Eh bien, ce n'est pas mentir - il n'y a pas de libpthread_rt.so.1
dans cette liste. Vous devrez probablement le reconfigurer et le reconstruire pour qu'il dépende de la bibliothèque dont vous disposez, ou installer ce qui fournit libpthread_rt.so.1
.
Généralement, les nombres après le .so sont des numéros de version, et vous trouverez souvent qu'ils sont des liens symboliques entre eux, donc si vous avez la version 1.1 de libfoo.so, vous aurez un vrai fichier libfoo.so.1.0, et les liens symboliques foo.so et foo.so.1 pointant vers libfoo.so.1.0. Et si vous installez la version 1.1 sans supprimer l'autre, vous aurez un libfoo.so.1.1, et libfoo.so.1 et libfoo.so pointeront maintenant vers le nouveau, mais tout code qui nécessite cette version exacte peut utilisez le fichier libfoo.so.1.0. Le code qui s'appuie uniquement sur l'API version 1, mais qui ne se soucie pas de savoir s'il s'agit de la version 1.0 ou 1.1 spécifiera libfoo.so.1. Comme orip l'a souligné dans les commentaires, cela est bien expliqué sur http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.
Dans votre cas, vous pourriez s'en tirer avec le lien symbolique libpthread_rt.so.1
à libpthread_rt.so
. Cependant, rien ne garantit qu'il ne cassera pas votre code et ne mangera pas vos dîners télévisés.