web-dev-qa-db-fra.com

Bibliothèques dans / usr / local / lib introuvables

Je construis une application en utilisant un framework appelé ohNet . Après avoir construit le framework, il est possible d'installer le framework via make install. Par défaut, les bibliothèques sont installées à l'intérieur du /usr/local/[lib|include] Dossiers. D'accord.

J'utilise Eclipse pour le développement. Pour utiliser ces bibliothèques, je dois définir le chemin d'accès à la bibliothèque (dans ce cas usr/local/include/ohNet), définissez le chemin de recherche de l'éditeur de liens (-L) (/usr/local/lib/ohNet) et des bibliothèques spécifiques (-l) (dans ce cas, je choisis une bibliothèque appelée libohNet.so qui est dans ce dossier. Lorsque je crée le projet dans Eclipse, cela fonctionne bien, mais si j'essaie d'exécuter le programme, je suis confronté au message suivant:

error while loading shared libraries: libohNet.so: cannot open shared object file: No such file or directory

J'ai revérifié cela, et le fichier libohNet.so est dans ce répertoire! Quelle est la raison pour laquelle ce fichier est introuvable?

J'ai recherché sur google et trouvé quelques articles, disant qu'il est problématique que les bibliothèques soient installées dans /usr/local/lib au lieu de /usr/libvoir ici ... Dois-je configurer des paramètres supplémentaires dans Eclipse pour que ld reconnaisse les bibliothèques de ce chemin? Quelle est la solution pour cela?

cordialement

27
Moonlit

Il s'agit d'une erreur d'exécution, pas d'une erreur de génération. La définition de l'indicateur -L Ne fait rien pour l'éditeur de liens d'exécution. Ce que vous devez faire est d'indiquer au chargeur d'exécution de rechercher également dans/usr/local/lib les bibliothèques. Vous pouvez le faire de deux manières. La première consiste à ajouter le chemin d'accès à la variable d'environnement LD_LIBRARY_PATH:

 export LD_LIBRARY_PATH = "$ LD_LIBRARY_PATH:/usr/local/lib" 

La seconde consiste à mettre à jour le fichier de configuration de l'éditeur de liens d'exécution. Cela peut se produire soit dans le fichier /etc/ld.so.conf, en mettant la ligne:

/usr/local/lib 

quelque part dans ce fichier, ou en créant un nouveau fichier * .conf dans le répertoire /etc/ld.so.conf.d/ qui contient le nouveau chemin. Par exemple:

/etc/ld.so.conf.d/99local.conf 

avec juste:

/usr/local/lib 

en elle. C'est la méthode recommandée pour cela, car elle vous permet de garder vos chemins de bibliothèque personnalisés séparés des chemins définis par le système. (Le préfixe "99" est là pour s'assurer que le fichier est chargé en dernier par rapport aux autres fichiers là-bas, afin qu'il ne devance pas les chemins système qui pourraient contenir les mêmes bibliothèques.)

Après avoir modifié/créé le fichier dans/etc, vous devez exécuter:

 ldconfig 

comme racine pour que le changement prenne effet. (Cette commande met à jour le fichier /etc/ld.so.cache, qui est le fichier réel utilisé par l'éditeur de liens d'exécution.)

Il existe également un autre moyen pour un binaire de trouver les bibliothèques nécessaires à l'exécution. Vous pouvez réellement coder en dur les chemins d'accès à la bibliothèque dans l'exécutable lui-même. Ceci est accompli en définissant un soi-disant "rpath". Ceci est une option de l'éditeur de liens et doit être passée de gcc (ou g ++) à l'éditeur de liens, donc l'option -Wl Doit être utilisée. L'option de l'éditeur de liens est -rpath=PATH. Vous devez donc l'ajouter à vos indicateurs de lien:

 - Wl, -rpath =/usr/local/lib 

Je ne le recommande cependant pas pour votre cas. Un rpath est utile lorsque vous expédiez des bibliothèques avec votre exécutable (peut-être avec un programme d'installation), et un rpath relatif (en utilisant la fonctionnalité rpath $Origin) Ou absolu (pour lorsque vous installez dans/opt, par exemple ) est ensuite utilisé pour rechercher ces bibliothèques groupées lors de l'exécution.

59
Nikos C.