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

Posted

技术标签:

【中文标题】如何在 Mac OSX 下使用 gcc 设置可执行文件的运行时路径(-rpath)?【英文标题】:How to set the runtime path (-rpath) of an executable with gcc under Mac OSX? 【发布时间】:2010-12-22 21:14:14 【问题描述】:

我想在 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 &lt;file&gt; 并搜索LC_RPATH 部分以查看二进制文件(库或exe)设置为搜索依赖库的路径。 这个页面有助于理解Mac上的rpath:https://blog.krzyzanowskim.com/2018/12/05/rpath-what/ 【参考方案1】:

通过实验发现,并检查 Xcode 生成的命令行是否有 reference rpath demo project by Dave Driblin:

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`

【讨论】:

是的,这行得通。鉴于在其他类 Unix 操作系统上存在现有的 -rpath 语义,Apple 的偏离实现似乎有点尴尬。至少他们应该在他们的 gcc 手册页版本中记录它。 @Karel 是正确的,但如果您想要更完整的替代方案列表,this 也可能会有所帮助。 使用otool -l &lt;file&gt; 并搜索LC_RPATH 部分以查看二进制文件(库或exe)设置为搜索依赖库的路径。 @cdunn2001 您的链接似乎已失效。 @dstromberg,你是对的。但是this 链接了相同的死链接,并解释了如何使用install_name_tool,这是我用来设置rpath 的。

以上是关于如何在 Mac OSX 下使用 gcc 设置可执行文件的运行时路径(-rpath)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MAC OSX上限制程序的内存使用的示例

C++:在 mac osx 上使用 std::cout 和 gcc

如何在 Mac OS X 下AA,安装 gcc

MAC OSX LION:mac 上的 gcc 未编译 wget

如何在Mac OSX编译Nordic芯片?

如何在Mac OSX编译Nordic芯片?