macos - macOS 如何在macosx下使用gcc设置可执行文件的运行时路径( rpath )?

  显示原文与译文双语对照的内容
108 2

我希望在 Mac at下设置可以执行( 对于链接器)的运行时路径,这样在程序开始时,动态链接程序就会找到共享库。

在Linux下,这是-Xlinker -rpath -Xlinker/path/to( 或者使用 -Wl,-rpath,/path/to ),在Solaris下,你可以将 -R/path/to 添加到编译器 命令行 。

从 ~ 开始,我发现有一些信息,这是自 10.5年以来,自 2008以来的-rpath支持。

我试图让它使用一个很小的例子- 没有成功:

$ cat blah.c 
int blah(int b)
{
 return b+1;
}

还有:

$ cat main.c 
#include <stdio.h>
int blah(int);
int main ()
{
 printf("%dn", 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

因此问题:如何在macosx下设置链接器的运行时路径?

设置 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个回答

107 3

experimentation experimentation experimentation的命令行,并检查由生成的命令行的命令行,由 Dave Driblin 演示:

otool -L 将显示链接库的安装 NAME 。要让 @rpath 工作,你需要更改库的安装 NAME:

$ 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`
原作者:
...