如何在Mac OSX下使用gcc设置可执行文件的运行时path(-rpath)?
我想在编译时在Mac OSX下设置一个可执行文件(对于连接器)的运行时path,以便在程序启动时由dynamic连接器find非标准位置的共享库。
在Linux下,可以使用-Xlinker -rpath -Xlinker /path/to
(或使用-Xlinker -rpath -Xlinker /path/to
, -Xlinker -rpath -Xlinker /path/to
-Wl,-rpath,/path/to
),在Solaris下,可以将-R/path/to
添加到编译器命令行。
我发现一些信息 ,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
现在testing:
$ 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下设置链接器的运行时path?
顺便说一句,设置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
只打印可执行文件链接的库名称(可能是链接时的位置),并且没有运行时path信息。
通过实验find并检查由Xcode生成的命令行,以供Dave Driblin参考的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`