web-dev-qa-db-fra.com

LD_LIBRARY_PATH vs LIBRARY_PATH

Je construis un programme C++ simple et je souhaite remplacer temporairement une bibliothèque partagée fournie par le système par une version plus récente de celle-ci, pour le développement et les tests.

J'ai essayé de définir la variable LD_LIBRARY_PATH mais le lieur (ld) a échoué avec:

/ usr/bin/ld: impossible de trouver -lyaml-cpp

Je m'attendais à ce que cela fonctionne car, selon la page de manuel de ld:

L'éditeur de liens utilise les chemins de recherche suivants pour localiser les bibliothèques partagées requises: ... Pour un éditeur de liens natif, le contenu de la variable d'environnement "LD_LIBRARY_PATH" ...

J'ai ensuite essayé de définir LIBRARY_PATH, et cela a fonctionné.

Selon le manuel GCC:

La valeur de LIBRARY_PATH est une liste de répertoires séparés par deux points, un peu comme PATH. Lorsqu'il est configuré en tant que compilateur natif, GCC essaie les répertoires ainsi spécifiés lors de la recherche de fichiers de l'éditeur de liens spéciaux, s'il ne peut pas les trouver à l'aide de GCC_EXEC_PREFIX. La liaison à l'aide de GCC utilise également ces répertoires lors de la recherche de bibliothèques ordinaires pour l'option -l (mais les répertoires spécifiés avec -L sont les premiers).

Comme le suggère le manuel (GCC), LIBRARY_PATH fonctionne parce que je suis en liaison avec GCC.

Mais..

  • Depuis que je fais le lien avec gcc, pourquoi ld est appelé, comme le message d'erreur le suggère?
  • Quel est l'intérêt d'avoir deux variables ayant le même objectif? Y-a-t'il d'autres différences?
141
Georgios Politis

LIBRARY_PATH est utilisé par gcc avant la compilation pour rechercher des répertoires contenant des bibliothèques statiques et partagées devant être liées à votre programme.

LD_LIBRARY_PATH est utilisé par votre programme pour rechercher les répertoires contenant les bibliothèques partagées après sa compilation et son lien.

EDIT: Comme indiqué ci-dessous, vos bibliothèques peuvent être statiques ou partagées. S'il est statique, le code est copié dans votre programme et vous n'avez pas besoin de rechercher la bibliothèque une fois votre programme compilé et lié. Si votre bibliothèque est partagée, elle doit être liée dynamiquement à votre programme et c'est alors que LD_LIBRARY_PATH entre en jeu.

195
Naveen

LD_LIBRARY_PATH est recherché au démarrage du programme, LIBRARY_PATH est recherché au moment de la liaison.

mise en garde de commentaires :

43
F'x

Depuis que je fais le lien avec gcc, pourquoi l'appel de ld, comme le suggère le message d'erreur?

gcc appelle ld en interne quand il est en mode liaison.

11
heroxbd