Je compile un programme C ++ en utilisant g++
et ld
. J'ai une .so
bibliothèque que je souhaite utiliser lors de la liaison. Cependant, une bibliothèque du même nom existe dans /usr/local/lib
et ld
choisit cette bibliothèque plutôt que celle que je spécifie directement. Comment puis-je réparer cela?
Pour les exemples ci-dessous, mon fichier de bibliothèque est /my/dir/libfoo.so.0
. Les choses que j'ai essayées qui ne fonctionnent pas:
- ma commande g ++ est
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
- ajout
/my/dir
au début ou à la fin de ma$PATH
variable en` - ajout
/my/dir/libfoo.so.0
comme argument à g ++
libfoo.*
fichiers existent et où -.so
w / o.0
,.a
, etc etc?Réponses:
Ajoutez le chemin d'accès à votre nouvelle bibliothèque
LD_LIBRARY_PATH
(son nom est légèrement différent sur Mac ...)Votre solution doit fonctionner avec l'utilisation du
-L/my/dir -lfoo
options, à l'exécution, utilisez LD_LIBRARY_PATH pour pointer vers l'emplacement de votre bibliothèque.Attention à l'utilisation de LD_LIBRARY_PATH - en bref (à partir du lien):
OU
Utilisez l'option rpath via gcc vers l'éditeur de liens - le chemin de recherche de la bibliothèque d'exécution sera utilisé au lieu de chercher dans le répertoire standard (option gcc):
C'est bon pour une solution temporaire. Linker recherche d'abord LD_LIBRARY_PATH pour les bibliothèques avant de rechercher dans les répertoires standard.
Si vous ne souhaitez pas mettre à jour définitivement LD_LIBRARY_PATH, vous pouvez le faire à la volée en ligne de commande:
Vous pouvez vérifier ce que l'éditeur de liens de bibliothèques sait utiliser (exemple):
Et vous pouvez vérifier quelle bibliothèque votre application utilise:
la source
LD_LIBRARY_PATH
est recherché au moment de l'exécution, au moment de la compilation que vous souhaitez définirLIBRARY_PATH
. Voir gcc.gnu.org/onlinedocs/gcc/Environment-Variables.htmlgcc myFile.c -o myFile.o -l myLibraryBaseName -Wl,-rpath,locationOfMyLibrary -L locationOfMyLibrary
C'est une vieille question, mais personne ne semble l'avoir mentionné.
Vous aviez de la chance que la chose soit reliée.
Vous aviez besoin de changer
pour ça:
Votre éditeur de liens garde une trace des symboles qu'il doit résoudre. S'il lit la bibliothèque en premier, il n'a aucun symbole nécessaire, il ignore donc les symboles qu'il contient. Spécifiez les bibliothèques après les éléments qui doivent y être liés afin que votre éditeur de liens ait des symboles à y trouver.
En outre,
-lfoo
il recherche spécifiquement un fichier nommélibfoo.a
oulibfoo.so
selon les besoins. Nonlibfoo.so.0
. Donc, soitln
le nom, soit renommer la bibliothèque comme approprié.Pour citer la page de manuel gcc:
Ajouter le fichier directement à
g++
la ligne de commande de la ligne de commande aurait dû fonctionner, à moins bien sûr que vous ne le mettiez avantbar.cpp
, ce qui oblige l'éditeur de liens à l'ignorer faute de symboles nécessaires, car aucun symbole n'était encore nécessaire.la source
La spécification du chemin absolu vers la bibliothèque devrait fonctionner correctement:
Avez-vous pensé à supprimer le
-lfoo
une fois que vous avez ajouté le chemin absolu?la source
@
symboles versionnés? Exemple minimal: github.com/cirosantilli/cpp-cheat/blob/…Comme alternative, vous pouvez utiliser les variables d'environnement
LIBRARY_PATH
etCPLUS_INCLUDE_PATH
, qui indiquent respectivement où chercher les bibliothèques et où chercher les en-têtes (CPATH
feront également le travail), sans spécifier les options -L et -I.Edit:
CPATH
inclut l'en-tête avec-I
etCPLUS_INCLUDE_PATH
avec-isystem
.la source
export LIBRARY_PATH = /path/to/lib
dans la même session console où vous compilezSi l'un d'entre eux est utilisé pour travailler avec DLL sous Windows et que vous souhaitez ignorer les numéros de version .so dans Linux / QT, l'ajout
CONFIG += plugin
supprimera les numéros de version. Pour utiliser le chemin absolu vers .so, le donner à l'éditeur de liens fonctionne bien, comme l'a mentionné M. Klatchko.la source