Ajoutez le chemin vers l'emplacement de votre nouvelle bibliothèque à LD_LIBRARY_PATH
(le nom est légèrement différent sur Mac...)
Votre solution devrait fonctionner avec l'utilisation du -L/my/dir -lfoo
à l'exécution, utilisez LD_LIBRARY_PATH pour indiquer 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 Ainsi, une personne mal intentionnée pourrait faire en sorte que votre application charge une version d'un fichier bibliothèque partagée qui contient du code malveillant ! C'est l'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ù se trouve la bibliothèque partagée. réside - pour TOUTES les bibliothèques partagées avec lesquelles l'application est liée ! Cela signifie beaucoup d'appels système à open(), qui échoueront avec "ENOENT (No such file or directory)" ! Si le chemin contient de nombreux répertoires, le nombre d'appels échoués augmentera de manière linéaire, et vous pouvez le constater en observant le temps de démarrage de l'application. Si certains (ou tous) les répertoires se trouvent dans un environnement NFS, le temps de de démarrage de vos applications peut vraiment devenir long - et cela peut ralentir l'ensemble du 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'a pas été liée, et qui n'est probablement pas compatible avec la bibliothèque originale. avec laquelle elle n'a pas été liée, et qui n'est très probablement pas version originale. Ce problème peut être très évident, c'est-à-dire que l'application l'application se bloque, ou cela peut conduire à des résultats erronés, si la bibliothèque récupérée fait pas tout à fait ce que la version originale aurait fait. Ce dernier cas Ce dernier cas est parfois difficile à déboguer.
OU
Utiliser l'option rpath via gcc pour 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 une bonne solution temporaire. Le linker recherche d'abord les bibliothèques dans LD_LIBRARY_PATH avant de chercher dans les répertoires standards.
Si vous ne voulez pas mettre à jour de façon permanente 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 quelles sont les bibliothèques connues par le linker en utilisant (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)