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

Je veux mettre sous Mac OSX le chemin d'exécution d'un fichier exécutable (pour les liens) au moment de la compilation, tels que les bibliothèques partagées à un emplacement non standard sont trouvés par l'éditeur de liens dynamique au démarrage du programme.

Sous Linux c'est possible avec -Xlinker -rpath -Xlinker /path/to (ou à l'aide de -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 -rpath soutien depuis 10.5, c'est à dire 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("%d\n", 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 puis-je définir le chemin d'exécution pour l'éditeur de liens sous Mac OSX?

Btw, réglage 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 imprime uniquement les noms de bibliothèque (et probables les lieux au moment de la liaison) l'exécutable a été lié avec et pas de chemin d'exécution d'informations.

  • Je n'ai pas de système OS X, mais la recherche autour de, install_name_tool pouvez ajouter rpaths à votre binaire. Je ne sais pas pourquoi le vôtre ne fonctionne pas — ce qui ne otool -L dire?
InformationsquelleAutor maxschlepzig | 2010-12-22