Le programme fait partie de la suite de tests Xenomai, compilée de manière croisée à partir du PC Linux dans la chaîne d'outils Linux + Xenomai ARM.
# echo $LD_LIBRARY_PATH
/lib
# ls /lib
ld-2.3.3.so libdl-2.3.3.so libpthread-0.10.so
ld-linux.so.2 libdl.so.2 libpthread.so.0
libc-2.3.3.so libgcc_s.so libpthread_rt.so
libc.so.6 libgcc_s.so.1 libstdc++.so.6
libcrypt-2.3.3.so libm-2.3.3.so libstdc++.so.6.0.9
libcrypt.so.1 libm.so.6
# ./clocktest
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory
Edit: OK, je n'ai pas remarqué que le .1 à la fin faisait partie du nom de fichier. Qu'est-ce que cela veut dire de toute façon?
linux
shared-libraries
file-not-found
xenomai
zaratustra
la source
la source
Réponses:
Mise à jour
Bien que ce que j'écris ci-dessous soit vrai comme 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 parce 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
libpthread_rt.so.1
en a pas dans cette liste. Vous devrez probablement le reconfigurer et le reconstruire de sorte qu'il dépende de la bibliothèque que vous avez, ou installer tout ce qui fournitlibpthread_rt.so.1
.Généralement, les numéros après le .so sont des numéros de version, et vous constaterez 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 repose uniquement sur l'API de la version 1, mais ne se soucie pas si c'est 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 vous en sortir avec un lien symbolique
libpthread_rt.so.1
verslibpthread_rt.so
. Cependant, rien ne garantit qu'il ne cassera pas votre code et ne mangera pas vos dîners télévisés.la source
Votre bibliothèque est une bibliothèque dynamique. Vous devez indiquer au système d'exploitation où il peut le localiser lors de l'exécution.
Pour ce faire, nous devrons suivre ces étapes simples:
(1) Trouvez où la bibliothèque est placée si vous ne la connaissez pas.
(2) Vérifier l'existence de la variable d'environnement de chemin de bibliothèque dynamique (
LD_LIBRARY_PATH
)s'il n'y a rien à afficher, ajoutez une valeur de chemin par défaut (ou pas si vous le souhaitez)
(3) Nous ajoutons le chemin du désir, l'exportons et essayons l'application.
Notez que le chemin doit être le répertoire où se
path.so.something
trouve le. Donc, sipath.so.something
c'est/my_library/path.so.something
dedans, ça devrait être:source: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
la source
find
find / -name the_name_of_the_file.so
LD_LIBRARY_PATH
devrait pointer vers le répertoire contenantpath.so.something
, pas verspath.so.something
lui-même.Voici quelques solutions que vous pouvez essayer:
ldconfig
Comme l'a souligné AbiusX: Si vous venez d'installer la bibliothèque, vous devrez peut-être simplement exécuter ldconfig .
Habituellement, votre gestionnaire de paquets s'en chargera 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.
Package de développement ou mauvaise version
Si cela ne fonctionne pas, je vérifierais également la suggestion de Paul et rechercherais 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 la rechercher:
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 package est installé et que ldconfig ne l'a pas trouvé, il se peut qu'il se trouve dans un répertoire non standard. Par défaut, ldconfig regarde dans
/lib
,/usr/lib
et répertoires listé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/etc/ld.so.conf
, ajouter le chemin d'accès à$LD_LIBRARY_PATH
la bibliothèque, soit déplacer la bibliothèque dans/usr/lib
. Ensuite, courezldconfig
.Pour savoir où se trouve la bibliothèque, essayez ceci:
(Remplacez
libraryname
par le nom de votre bibliothèque)Si vous suivez la
$LD_LIBRARY_PATH
route, vous voudrez mettre cela dans votre~/.bashrc
fichier pour qu'il s'exécute à chaque fois que vous vous connectez:la source
.conf
de mes propres fichiers avec les chemins de bibliothèque non standard dont j'ai besoin/etc/ld.so.conf.d
(indiqué par/etc/ld.so.conf
) a fait l'affaire.J'ai eu une erreur similaire, je pouvais la résoudre en donnant,
J'espère que cela t'aides.
la source
Vous devez vous assurer que vous spécifiez le chemin de la bibliothèque lors de la liaison lorsque vous compilez votre fichier .c:
La partie -Wl, -R indique au binaire résultant de rechercher également la bibliothèque dans / usr / local / lib au moment de l'exécution avant d'essayer d'utiliser celle dans / usr / lib /
J'espère que cela vous aidera.
la source
-Wl,-rpath DIR
.Essayez d'ajouter
LD_LIBRARY_PATH
, qui indique des chemins de recherche, à votre~/.bashrc
fichierÇa marche!
la source
La page de référence linux.org explique la mécanique, mais n'explique aucune des motivations derrière elle :-(
Pour cela, consultez Sun Linker and Libraries Guide
De plus, notez que le «versionnage externe» est largement obsolète sous Linux, car le versionnage de symboles (une extension GNU) vous permet d'avoir plusieurs versions incompatibles de la même fonction pour être présentes dans une seule bibliothèque. Cette extension a permis à glibc d'avoir la même version externe:
libc.so.6
depuis 10 ans.la source
ajoutez ces lignes à la fin
la source
J'ai eu une erreur similaire et elle n'a pas été corrigée en donnant LD_LIBRARY_PATH dans ~ / .bashrc. Ce qui a résolu mon problème, c'est en ajoutant un fichier .conf et en le chargeant. Allez au terminal et soyez en su.
Ajoutez votre chemin de bibliothèque dans ce fichier et enregistrez (par exemple: / usr / local / lib). Vous devez exécuter la commande suivante pour activer le chemin:
Vérifiez votre nouveau chemin de bibliothèque:
Si cela montre vos fichiers de bibliothèque, alors vous êtes prêt à partir.
la source
Une autre solution possible selon votre situation.
Si vous savez que libpthread_rt.so.1 est identique à libpthread_rt.so, vous pouvez créer un lien symbolique en:
Ensuite,
ls -l /lib
devrait maintenant montrer le lien symbolique et ce qu'il pointe.la source
J'ai eu cette erreur lors de l'exécution de mon application avec Eclipse CDT sur Linux x86.
Pour résoudre ce problème:
Définissez le chemin
la source
Tout ce que j'avais à faire était de courir:
J'étais dans le dossier situé à
/usr/lib/x86_64-linux-gnu
et cela fonctionnait parfaitement.la source
Si vous exécutez votre application sur Microsoft Windows, le chemin d'accès aux bibliothèques dynamiques (.dll) doit être défini dans la variable d'environnement PATH.
Si vous exécutez votre application sous UNIX, le chemin d'accès à vos bibliothèques dynamiques (.so) doit être défini dans la variable d'environnement LD_LIBRARY_PATH.
la source
essayez d'installer sudo lib32z1
la source
L'erreur se produit car le système ne peut pas se référer au fichier de bibliothèque mentionné. Suivez les étapes suivantes:
locate libpthread_rt.so.1
affichera le chemin de tous les fichiers portant ce nom. Supposons qu'un chemin soit/home/user/loc
.cd home/USERNAME
. Remplacez USERNAME par le nom de l'utilisateur actif actuel avec lequel vous souhaitez exécuter le fichier.vi .bash_profile
et à la fin duLD_LIBRARY_PATH
paramètre, juste avant.
, ajoutez la ligne/lib://home/usr/loc:.
. Enregistrez le fichier.la source
J'ai cette erreur et je pense que c'est la même raison que la vôtre
Essaye ça. Correction des autorisations sur les fichiers:
«Sudo su» pour obtenir des autorisations sur votre système de fichiers.
la source
J'ai cette erreur et je pense que c'est la même raison que la vôtre
Essaye ça. Correction des autorisations sur les fichiers:
la source
problème similaire trouvé ici: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 J'ai essayé la solution mentionnée et cela fonctionne réellement.
Les solutions des questions précédentes peuvent fonctionner. Mais je pense que c'est un moyen facile de le réparer. Essayez de réinstaller le package
libwbclient
dans fedora:la source
J'utilise Ubuntu 18.04
L'installation du package "-dev" correspondant a fonctionné pour moi,
J'obtenais l'erreur ci-dessous jusqu'à ce que j'installe le package ci-dessus,
la source