我想在Mac OSX下在编译时设置可执行文件(对于链接器)的运行时路径,以便在程序启动时动态链接器找到非标准位置的共享库。
在Linux下,可以使用-Xlinker -rpath -Xlinker /path/to
(或使用-Wl,-rpath,/path/to
),在Solaris下,可以将-R/path/to
添加到编译器命令行。
我发现some information Mac OS X gcc自10.5以来就支持-rpath,即自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
似乎只打印了可执行文件链接的库名(可能是链接时的位置),没有运行时路径信息。
答案 0 :(得分:35)
通过实验找到,并检查Xcode为reference rpath demo project by Dave Driblin生成的命令行:
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`