où est LD_LIBRARY_PATH? comment définir la variable env LD_LIBRARY_PATH?

26

J'essaye de construire un programme c ++ en utilisant Unix.

J'ai l'erreur

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

J'ai entendu dire qu'il me suffit de définir l'emplacement de libboost * dans ma variable env LD_LIBRARY_PATH, puis d'appeler make comme je l'ai fait à l'origine, en tapant

-L /usr/lib64 -l boost_regex-mt

ou

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Mais où est LD_LIBRARY_PATH? comment définir la variable env LD_LIBRARY_PATH?

csx
la source
Pourquoi avez-vous modifié la plupart de votre question alors qu'elle fournissait un contexte utile pour comprendre votre problème?
jlliagre
@jlliagre Je suis d'accord: sans le contexte fourni par la question d'origine, la réponse la plus votée n'a aucun sens. Je l'ai fait reculer.
John1024

Réponses:

25

comment définir la variable env LD_LIBRARY_PATH?

Vous l'avez déjà défini lorsque vous avez fait cela:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Mais cela ne résoudra pas votre problème. $LD_LIBRARY_PATHest consulté au moment de l'exécution, pour fournir une liste de répertoires supplémentaires dans lesquels rechercher des bibliothèques pouvant être liées dynamiquement. Il n'est pas consulté au moment du lien (sauf peut-être pour localiser les bibliothèques requises par les outils construits eux-mêmes!).

Afin d'indiquer à l'éditeur de liens où trouver les bibliothèques au moment de la construction, vous devez utiliser l' -Loption de l' éditeur de liens. Vous l'avez déjà fait aussi:

-L /usr/lib64

Si l'erreur persiste, vous devez vous assurer que la bibliothèque est bien là. Avez-vous un fichier libboost_regex-mt.soou libboost_regex-mt.adans ce (ou tout) répertoire? Notez qu'un fichier comme libboost_regex-mt.so.othersuffixne compte pas à cet effet. Si vous ne l'avez pas, vous devrez probablement installer le package de développement de votre distribution pour cette bibliothèque.

Celada
la source
Sous Linux, selon la page de manuel ld (1), $LD_LIBRARY_PATHest également consulté par ld: «5. Pour un éditeur de liens natif, recherchez le contenu de la variable d'environnement" LD_LIBRARY_PATH ". »
vinc17
@csx - quelle est votre distribution? Ubuntu, Fedora, CentOS, etc.? Voir ici, par exemple: stackoverflow.com/questions/15874220/…
slm
@ vinc17, Cette citation de la ldpage de manuel ne concerne que les dépendances récursives: les bibliothèques dépendantes d'une bibliothèque qui a déjà été sélectionnée pour être liée. Elle ne concerne pas la recherche de bibliothèques pour l'exécutable en cours de construction. C'est -Lça.
Celada
@csx Je ne sais rien de Linux scientifique, mais si apt-getvous donne une commande introuvable, elle n'est pas dérivée de Debian, vous avez donc besoin d'une autre méthode pour installer le paquet manquant. C'est certainement votre problème.
Celada
Tard mais: -Ldir -llibdevrait fonctionner comme argument vers ldou vers gcc/g++/etclors de l'inclusion de la phase de lien, mais Q original et restauré mentionne make: avec un makefile normal dont vous avez probablement besoin LDFLAGS="whatever"et avec un makefile intelligent, vous pouvez avoir besoin de presque tout, y compris des briques à jeter à l'auteur du makefile intelligent.
dave_thompson_085
11

Une autre façon d'ajouter définitivement un nouveau chemin dans LD_LIBRARY_PATH:

Modifier le .conffichier dans/etc/ld.so.conf.d/ .

J'ai déjà installé une application et ses bibliothèques ne pouvaient pas être reconnues par une autre application. Ensuite, j'ajoute le chemin, c'est /usr/local/hdf5/lib-à- dire àx86_64-linux-gnu.conf fichier. Mettez simplement la ligne suivante. Sauver.

Ensuite, exécutez sudo ldconfig

Ça a marché.

PS: OS Ubuntu 14.04

iparjono
la source
4

Vous pouvez le définir dans votre ~/.profilefichier init et / ou spécifique de votre shell (par exemple ~/.bashrcpour bash, ~/.zshenvpour zsh). Ensuite, vous devez redémarrer votre shell (et éventuellement vous déconnecter et vous reconnecter, selon votre choix).

Vous pouvez vérifier vos paramètres avec:

env | grep '^LD_LIBRARY_PATH'

EDIT: LD_LIBRARY_PATHest destiné aux bibliothèques partagées qui contiennent du code machine, dont les noms de fichiers contiennent généralement .sodans leur nom, éventuellement suivis de nombres séparés par des points afin de distinguer les différentes versions. Il est possible que, malgré LD_LIBRARY_PATH, aucune bibliothèque ne soit trouvée en raison de la non-concordance d'ABI. Notez également que les langues (comme Perl et Python) et les packages peuvent avoir leur propre système de bibliothèques (éventuellement aussi avec des .sofichiers), sans rapport avec LD_LIBRARY_PATH.

vinc17
la source
Mon programme compilé se plaint toujours de ne pas trouver de bibliothèque python bien que je vois le chemin correct en utilisant env | grep '^ LD_LIBRARY_PATH'. Quel pourrait être le problème?
Herman Toothrot
@HermanToothrot J'ai mis à jour ma réponse. Notez que python a son propre système de bibliothèques. Je soupçonne qu'il n'utilise pas LD_LIBRARY_PATH(pour éviter les collisions avec les bibliothèques habituelles). Vous devez poser une question spécifique à ce sujet, avec le message d'erreur que vous obtenez.
vinc17
3

Si votre erreur de chemin d'accès à la bibliothèque se trouve dans l'éditeur de liens, lors de la compilation, vous devez ajouter le chemin d'accès à la bibliothèque dans la variable $ LD_LIBRARY_PATH. Si l'erreur de bibliothèque survient lorsque vous exécutez réellement le programme compilé, vous devez ajouter le chemin de bibliothèque à /etc/ld.so.conf et exécuter ldconfig pour reconstruire le cache du chemin de recherche de bibliothèque.

Gary
la source
cela a très bien fonctionné! Mon fichier conf pointe vers ce répertoire /etc/ld.so.conf.d alors ajoutez simplement un fichier avec votre chemin d'accès aux bibliothèques dans ce dossier. assurez-vous également d'exécuter ldconfig en tant que root (ou sudo)
RLaaa
0

Résolu avec:

ajouter dans /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
Dave
la source