How to set the runtime path (-rpath) of an executable with gcc under Mac OSX?
我想在mac osx下设置可执行文件(对于链接器)在编译时的运行时路径,以便动态链接器在程序启动时找到非标准位置的共享库。
在Linux下,使用
我发现了一些信息,Mac OS X GCC从10.5开始就支持-rpath,也就是从2008年开始。
我试图用一个最小的例子来实现它——但没有成功:
1 2 3 4 5 | $ cat blah.c int blah(int b) { return b+1; } |
还有:
1 2 3 4 5 6 7 8 9 10 11 12 | $ cat main.c #include <stdio.h> int blah(int); int main () { printf("%d ", blah(22)); return 0; } |
编译如下:
1 2 3 | $ gcc -c blah.c $ gcc -dynamiclib blah.o -o libblah.dylib $ gcc main.c -lblah -L`pwd` -Xlinker -rpath -Xlinker `pwd`/t |
现在测试:
1 2 3 4 5 6 7 | $ 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下设置链接器的运行时路径?
顺便说一句,设置
编辑:关于
1 2 3 4 | $ 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) |
似乎
通过实验发现,并检查xcode为Dave Driblin的参考rpath演示项目生成的命令行:
1 2 3 | $ 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` |