Как установить путь выполнения (-rpath) исполняемого файла с gcc под Mac OSX? - PullRequest
43 голосов
/ 23 декабря 2010

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

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

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

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

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

И:

$ cat main.c 

#include <stdio.h>

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?

Кстати, настройка 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 печатает только имена библиотек (и вероятные места во время соединения), исполняемый файл был связан с against и нет информации о пути выполнения.

1 Ответ

35 голосов
/ 23 декабря 2010

Найден экспериментальным путем и проверкой командных строк, сгенерированных 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`
...