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..
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 :
ld
(au lieu de gcc
ou g++
), les variables d’environnement LIBRARY_PATH
ou LD_LIBRARY_PATH
ne sont pas lues. 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.