LD_LIBRARY_PATH vs LIBRARY_PATH

Je construis un programme C ++ simple et je veux substituer temporairement une bibliothèque partagée fournie par le système avec une version plus récente, pour le développement et les tests.

J’ai essayé de définir la variable LD_LIBRARY_PATH mais l’éditeur de liens (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 requirejses: … Pour un éditeur de liens natif, le contenu de la variable d’environnement “LD_LIBRARY_PATH” …

J’ai ensuite essayé de configurer LIBRARY_PATH, et cela a fonctionné.

Selon le manuel de GCC:

La valeur de LIBRARY_PATH est une liste de répertoires séparés par des deux-points, tout 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 les trouve pas à 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 car je lie avec GCC.

Mais..

  • Comme je lie avec gcc pourquoi ld est appelé, comme le suggère le message d’erreur?
  • Quel est l’intérêt d’avoir deux variables servant le même objective? Y-a-t’il d’autres différences?

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

LD_LIBRARY_PATH est utilisé par votre programme pour rechercher des répertoires contenant des bibliothèques partagées après avoir été compilé et lié avec succès.

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 dynamicment à votre programme et c’est à ce moment que LD_LIBRARY_PATH entre en jeu.

LD_LIBRARY_PATH est recherché lorsque le programme démarre, LIBRARY_PATH est recherché au moment du lien.

mise en garde de commentaires :

  • Lorsque vous liez des bibliothèques avec ld (au lieu de gcc ou g++ ), les variables d’environnement LIBRARY_PATH ou LD_LIBRARY_PATH ne sont pas lues.
  • Lors de la liaison de bibliothèques avec gcc ou g++ , la variable d’environnement LIBRARY_PATH est lue (voir la documentation ” gcc utilise ces répertoires pour rechercher des bibliothèques ordinaires” ).

Comme je lie avec gcc pourquoi ld est appelé, comme le suggère le message d’erreur?

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