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):
..implications ..:
Sécurité : Vous vous souvenez que les répertoires spécifiés dans LD_LIBRARY_PATH sont recherchés avant (!) les emplacements standard? De cette façon, une personne méchante pourrait amener votre application à charger une version d'une bibliothèque partagée contenant du code malveillant! C'est une des raisons pour lesquelles les exécutables setuid / setgid négligent cette variable!
Performance: Le chargeur de liens doit rechercher tous les répertoires spécifiés, jusqu'à ce qu'il trouve le répertoire où réside la bibliothèque partagée - pour TOUTES les bibliothèques partagées, l'application est liée! Cela signifie beaucoup d'appels système à open (), qui échoueront avec «ENOENT (aucun fichier ou répertoire de ce type)»! Si le chemin contient de nombreux répertoires, le nombre d'appels ayant échoué augmentera de manière linéaire, et vous pouvez le voir dès le démarrage de l'application. Si certains (ou tous) des répertoires se trouvent dans un environnement NFS, le temps de démarrage de vos applications peut vraiment être long - et cela peut ralentir tout le système!
Incohérence: C'est le problème le plus courant. LD_LIBRARY_PATH force une application à charger une bibliothèque partagée avec laquelle elle n'était pas liée, et qui n'est probablement pas compatible avec la version originale. Cela peut être très évident, c'est-à-dire que l'application plante, ou cela peut conduire à des résultats erronés, si la bibliothèque récupérée ne fait pas tout à fait ce que la version originale aurait fait. Surtout ce dernier est parfois difficile à déboguer.
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):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
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:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
Vous pouvez vérifier ce que l'éditeur de liens de bibliothèques sait utiliser (exemple):
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
Et vous pouvez vérifier quelle bibliothèque votre application utilise:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
fichiers existent et où -.so
w / o.0
,.a
, etc etc?