LD_LIBRARY_PATH et LIBRARY_PATH

159

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 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 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 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 viennent en premier).

Comme le suggère le manuel (GCC), LIBRARY_PATH fonctionne parce que je suis lié à GCC.

Mais..

  • Depuis que je suis lié à 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 objectif? Y-a-t'il d'autres différences?
Georgios Politis
la source

Réponses:

213

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

LD_LIBRARY_PATHest utilisé par votre programme pour rechercher des répertoires contenant des bibliothèques partagées après qu'il a été correctement compilé et lié.

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 que votre programme est compilé et lié. Si votre bibliothèque est partagée, elle doit être liée dynamiquement à votre programme et c'est là LD_LIBRARY_PATHqu'entre en jeu.

Naveen
la source
14
Et bien sûr, LD_LIBRARY_PATH n'a de sens qu'avec les bibliothèques dynamiques
Alex Jasmin
2
Mon point est que si je devais utiliser ld pour lier (directement), alors, selon le manuel ld, LD_LIBRARY_PATH aurait été utilisé pour rechercher des répertoires contenant les bibliothèques qui doivent être liées à mon programme. Je dois manquer quelque chose ici ..
Georgios Politis
2
à moins que vous n'appeliez ld vous-même et que vous ne combiniez les fichiers objets avec les bibliothèques, il «héritera» du chemin que gcc lui passe. Vous pouvez remplacer le gcc standard, avec les options -Xlinker.
Naveen
5
En fait, LIBRARY_PATH est utilisé pour rechercher des répertoires contenant des bibliothèques statiques ET dynamiques, au lieu de seulement des bibliothèques statiques.
particule128
3
Oui, c'est faux - la différence est que l' LIBRARY_PATHon recherche les bibliothèques (statiques ou dynamiques) au moment de la compilation et LD_LIBRARY_PATHque les bibliothèques dynamiques sont recherchées au moment de l'exécution. Bien sûr, au moment de l'exécution, vous n'avez pas besoin de rechercher des bibliothèques statiques.
Timmmm
47

LD_LIBRARY_PATHest recherché au démarrage du programme, LIBRARY_PATHest recherché au moment de la liaison.

mise en garde des commentaires :

F'x
la source
38
Remarque: lors de la liaison des bibliothèques, ldpar lui - même ne semble pas pour les bibliothèques dans les deux LIBRARY_PATHou LD_LIBRARY_PATH. Il est seulement quand gccinvoque ldqui LIBRARY_PATHse habitue. (
J'ai
1
@Rufflewind Intéressant, mais l'aurait été encore plus si vous aviez donné une référence.
hmijail pleure les démissionnaires le
Cette vue fait une distinction au moment où les bibliothèques sont recherchées (temps de liaison versus temps d'exécution) tandis que @Naveen distingue le type de bibliothèques recherchées (statique v dynamique). Existe-t-il deux vues effectivement identiques (dynamique: temps d'exécution = statique: temps de liaison) ou y a-t-il des situations importantes où cette correspondance ne tient pas? Je suppose que certaines connaissances sur les bibliothèques dynamiques sont également nécessaires au moment de la compilation.
XavierStuvw
13

Depuis que je suis lié à gcc, pourquoi ld est appelé, comme le suggère le message d'erreur?

gcc appelle ld en interne lorsqu'il est en mode liaison.

heroxbd
la source