Как установить путь выполнения (-rpath) исполняемого файла с помощью gcc в Mac OSX?

Я хочу установить в Mac OSX путь выполнения исполняемого файла (для компоновщика) во время компиляции, так что разделяемые библиотеки в нестандартных местах обнаруживаются динамическим компоновщиком при запуске программы.

В Linux это возможно с помощью -Xlinker -rpath -Xlinker /path/to (или с использованием -Wl,-rpath,/path/to ), а в Solaris вы можете добавить -R/path/to в командную строку компилятора.

Я нашел некоторую информацию о том, что Mac OS X gcc поддерживает -rpath с 10.5, то есть с ~ 2008.

Я попытался заставить его работать с минимальным примером – без успеха:

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

А также:

 $ cat main.c #include  int blah(int); int main () { printf("%d\n", blah(22)); return 0; } 

Скомпилировано так:

 $ gcc -c blah.c $ gcc -dynamiclib blah.o -o libblah.dylib $ gcc main.c -lblah -L`pwd` -Xlinker -rpath -Xlinker `pwd`/t 

Теперь тест:

 $ 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 

Таким образом, вопрос: как установить путь выполнения для компоновщика под Mac OSX?

Btw, настройка DYLD_LIBRARY_PATH работает, но я не хочу использовать этот хак.

Изменить: Что касается 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) 

Кажется, что otool -L только печатает имена библиотек (и, вероятно, местоположения во время соединения), с которым был связан исполняемый файл, и никакой информации о пути выполнения.

Найденный экспериментом и проверяющий командные строки, созданные Xcode для эталонного демонстрационного проекта rpath Дейвом Дриблином :

otool -L показывает вам имя установки связанных библиотек. Чтобы заставить @rpath работать, вам нужно изменить имя для установки библиотеки:

 $ 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` 
Давайте будем гением компьютера.