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 dans des emplacements non standards soient trouvées par le linker dynamique au début du programme.

sous Linux c'est possible avec -Xlinker -rpath -Xlinker /path/to (ou en utilisant -Wl,-rpath,/path/to) et sous Solaris, vous pouvez ajouter -R/path/to à la ligne de commande du compilateur.

j'ai trouvé quelques informations que Mac OS X gcc a le support-rpath depuis 10.5, i.e. depuis ~ 2008.

j'ai essayé de le faire fonctionner avec un minimum d'exemple - sans succès:

$ cat blah.c 
int blah(int b)
{
  return b+1;
}

Et:

$ cat main.c 

#include <stdio.h>

int blah(int);

int main ()
{
  printf("%dn", blah(22));
  return 0;
}

Compilé comme ceci:

$ 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?

Btw, la configuration de DYLD_LIBRARY_PATH fonctionne - mais je ne veux pas utiliser ce hack.

Edit: Concernant otool -L:

$ otool -L a.out 
a.out:
        libblah.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

Il semble que otool -L n'imprime que les noms des bibliothèques (et probablement les localisations au moment du lien) avec lesquelles l'exécutable a été lié et aucune information de chemin d'exécution.

41
demandé sur maxschlepzig 2010-12-23 00:14:14

1 réponses

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

otool -L vous montre le nom d'installation des bibliothèques liées. Pour obtenir @rpath au travail, vous avez besoin de changer l'installation nom 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`
34
répondu Ben Karel 2010-12-23 00:02:19