Je veux définir sous Mac OSX le chemin d'exécution d'un exécutable (pour le linker) au moment de la compilation, de sorte que les bibliothèques partagées situées à des emplacements non standards soient trouvées par le linker dynamique au démarrage du programme.
Sous Linux, cela est possible avec -Xlinker -rpath -Xlinker /chemin/vers
(ou en utilisant -Wl,-rpath,/chemin/vers
) et sous Solaris, vous pouvez ajouter -R/chemin/vers
à la ligne de commande du compilateur.
J'ai trouvé des informations indiquant que le support de -rpath est disponible pour le gcc de Mac OS X depuis la version 10.5, c'est-à-dire depuis ~ 2008.
J'ai essayé de le faire fonctionner avec un exemple minimal - sans succès :
$ cat blah.c
int blah(int b)
{
return b+1;
}
Et :
$ cat main.c
#include
int blah(int);
int main ()
{
printf("%d\n", blah(22));
return 0;
}
Compilé de cette manière :
$ gcc -c blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd` -Xlinker -rpath -Xlinker `pwd`/t
Maintenant le test :
$ mkdir t
$ mv libblah.dylib t
$ ./a.out
dyld: Library not loaded: libblah.dylib
Referenced from: /Users/max/test/./a.out
Reason: image not found
Trace/BPT trap
Donc la question : Comment définir le chemin d'exécution pour le linker sous Mac OSX ?
Par ailleurs, définir DYLD_LIBRARY_PATH
fonctionne - mais je ne veux pas utiliser cette astuce.
Édition : En ce qui concerne otool -L
:
$ otool -L a.out
a.out:
libblah.dylib (version de compatibilité 0.0.0, version actuelle 0.0.0)
/usr/lib/libSystem.B.dylib (version de compatibilité 1.0.0, version actuelle 125.2.1)
Il semble que otool -L
imprime seulement les noms des bibliothèques (et probablement les emplacements au moment du lien) avec lesquels l'exécutable a été lié et aucune information sur le chemin d'exécution.