web-dev-qa-db-fra.com

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

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?

29
csx

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_PATH est 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 le -L option 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.so ou libboost_regex-mt.a dans ce (ou tout) répertoire? Notez qu'un fichier comme libboost_regex-mt.so.othersuffix ne compte pas à cette fin. Si vous ne l'avez pas, vous devrez probablement installer le package de développement de votre distribution pour cette bibliothèque.

29
Celada

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

Éditer .conf fichier 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-à-dire /usr/local/hdf5/lib, à x86_64-linux-gnu.conf fichier. Mettez simplement la ligne suivante. Sauver.

Exécutez ensuite Sudo ldconfig

Ça a marché.

PS: OS Ubuntu 14.04

15
iparjono

Vous pouvez le définir dans votre ~/.profile et/ou un fichier d'initialisation spécifique de votre shell (par exemple ~/.bashrc pour bash, ~/.zshenv pour 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'

ÉDITER: LD_LIBRARY_PATH est destiné aux bibliothèques partagées qui contiennent du code machine, dont les noms de fichiers contiennent généralement .so dans leur nom, éventuellement suivi de chiffres séparés par des points afin de distinguer les différentes versions. Il est possible que malgré LD_LIBRARY_PATH, une bibliothèque est introuvable en raison de la non-concordance d'ABI. Notez également que les langages (comme Perl et Python) et les packages peuvent avoir leur propre système de bibliothèques (éventuellement aussi avec .so fichiers), sans rapport avec LD_LIBRARY_PATH.

4
vinc17

Si votre erreur de chemin de 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.

3
Gary

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
1
Dave