【发布时间】:2011-05-29 15:59:43
【问题描述】:
我想在 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 有效 - 但我不想使用这个 hack。
编辑:关于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 只打印可执行文件链接到的库名称(以及链接时可能的位置),没有运行时路径信息。
【问题讨论】:
-
我没有 OS X 系统但四处搜索,install_name_tool 可以将 rpaths 添加到您的二进制文件中。不知道为什么你的不工作 -
otool -L说什么? -
使用
otool -l <file>并搜索LC_RPATH部分以查看二进制文件(库或exe)设置为搜索依赖库的路径。 -
这个页面有助于理解Mac上的rpath:https://blog.krzyzanowskim.com/2018/12/05/rpath-what/
标签: macos gcc linker shared-libraries dyld