Linux Programme ne peut pas trouver de Bibliothèque Partagée à l'exécution
Je suis en train de compiler un programme linux, id3v2, et il dit qu'il est ne peut pas trouver la bibliothèque appropriée:
id3v2: error while loading shared libraries: libid3-3.8.so.3: cannot open shared object file: No such file or directory
Je suppose que c'est la partie qui tire dans le lidid3 bibliothèque?
Le fichier N'existe pas, cependant, ce qu'ils recherchent est en fait un lien symbolique vers:
"ibid3-3.8..3.0.0"
Je me demande si c'est un problème de ne pas être en mesure de suivre les liens symboliques? Je pourrais peut-être changer manuellement à la recherche de 0,0 si je savais où je cherchais à changer.
Je suis heureux de clarifier tous les détails.
Il ressemble à de la sont fait de la façon suivante:
id3v2: convert.o list.o id3v2.o genre.o
${CXX} ${LDFLAGS} -pedantic -Wall -g -o $@ $^ -lz -lid3
J'ai été en mesure d'utiliser Simon conseils pour comprendre qu'il y avait plusieurs endroits où l'on pourrait s'attendre à une bibliothèque. - Je créer un lien symbolique où le programme a été en reliant le fichier RÉEL.
Merci Simon!
De toute évidence, je ne comprends pas ce que je fais. Je vais essayer de lire votre déclaration et voir si je peux suivre vos conseils.
Cela pourrait être prometteur... stackoverflow.com/questions/3490667/...
Avez-vous essayez d'exécuter
ldconfig
en tant que root? Ce programme rend un registre des bibliothèques utilisées pour l'exécution de chargement de bibliothèque. Le truc, c'est que la bibliothèque doit être dans un endroit qui ldconfig
s'attend à le voir, qui dépend de la distribution. La liste des répertoires de la bibliothèque est généralement dans /etc/ld.so.conf
ou dans un endroit similaire.J'ai juste couru ldconfig en tant que root. Pas de changement. Mais maintenant je sais que ça existe!
OriginalL'auteur Scott | 2011-01-21
Vous devez vous connecter pour publier un commentaire.
Des liens symboliques sur les bibliothèques fonctionnent bien, aussi longtemps que l'objectif final il trace pour existe et est accessible.
Vous avez construit une dynamique liée exécutable, qui souhaite être lié à l'encontre de libid3-3.8..3 au moment de l'exécution. Ce fait est probablement lié au cours de la phase de construction avec quelque chose comme
-L/path/to/libid3/directory -lid3
.Vous avez un peu de options de faire
libid3
disponibles, dans l'ensemble, en ordre décroissant de préférence (puisque vous n'avez pas mentionné où le fichier a été, je ne peux qu'être général):libid3*
dans un répertoire listé dans/etc/ld.so.conf
(ou/lib
ou/usr/lib
)libid3*
à un répertoire listé dans/etc/ld.so.conf
(ou/lib
ou/usr/lib
) (par défaut)libid3*
à/etc/ld.so.conf
LD_LIBRARY_PATH=/directory/path/to/libid3*
avant d'exécuter votre id3v2 exécutable.id3v2
de manière statique. (Il va travailler, mais ne vous inquiétez pas.)Après de la première des 3, exécutez à nouveau
ldconfig
si l'éditeur de liens mise à jour du cache. (Vous pouvez ensuite exécuterldconfig -v
pour vérifier que c'est résolu.)Note ce sont pas des étapes, ils sont des options. Vous avez seulement besoin de faire 1 d'entre eux.
Heureux que vous avez mis à jour le titre.
#include
directives n'ont rien à voir avec le lien.Il est compris quelque chose: l'en-tête, qui contient les déclarations des fonctions et des types de variables, etc., de sorte que le compilateur sait types de variables, les signatures de méthode, etc. Ceci est différent de la liaison à une bibliothèque qui permet d'accéder à de béton le code de l'exécutable soit intégré dans, ou de manière dynamique lié à l'exécutable final. Il peut être source de confusion lorsqu'on passe d'un langage interprété, car il y a moins de distinction (du point de vue du programmeur, de toute façon) entre la source et le code de l'exécutable.
Ouais, j'ai littéralement JAMAIS rien fait avec un langage compilé. Je suis sûr que je vais relire tout ce que vous avez écrit plusieurs fois. Merci encore.
Avez-vous une idée de comment je pourrais comprendre d'où il s'ATTEND à ce que la fichier?
Il peut être dans l'un des répertoires listés dans
/etc/ld.so.conf
, ou les valeurs par défaut de/lib
et/usr/lib
. L'exécutable généralement seulement un nom de fichier de la bibliothèque de référence sans chemin. Le moteur d'exécution de l'éditeur de liens (généralement/lib/ld.so
ou/lib/ld-linux.so
avec un certain numéro de version) vérifie tous ses répertoires configurés pour la bibliothèque, et puis des liens entre eux à chaque fois que le programme démarre. Si vous venez de me dire le chemin où votrelibid3-3.8.so.3
fichier, je peux vous donner des commandes.OriginalL'auteur Sdaz MacSkibbons
J'ai eu le même message d'erreur que vous avez fait, et après avoir lu les solutions mentionnées ici, j'ai résolu le problème (sur Ubuntu 8) avec:
OriginalL'auteur Kristopher Windsor
Cela a résolu le problème il suffit d'ajouter /usr/local/lib dans /etc/ld..conf (sauf si elle est déjà là; seulement le mettre une fois), puis de lancer ldconfig.
OriginalL'auteur zombocom