如何在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`