42 votes

Comment définir le chemin d'exécution (-rpath) d'un exécutable avec gcc sous Mac OSX ?

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.

37voto

Ben Karel Points 2731

Trouvé par expérimentation et en inspectant les lignes de commande générées par Xcode pour un projet de démonstration de rpath de référence par Dave Driblin:

otool -L vous montre le nom d'installation des bibliothèques liées. Pour que @rpath fonctionne, vous devez changer le nom d'installation de la bibliothèque:

$ gcc -dynamiclib blah.o -install_name @rpath/t/libblah.dylib -o libblah.dylib
$ mkdir t ; mv libblah.dylib t/
$ gcc main.c -lblah -L`pwd`/t -Xlinker -rpath -Xlinker `pwd`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X