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

How to set the runtime path (-rpath) of an executable with gcc under Mac OSX?

我想在mac osx下设置可执行文件(对于链接器)在编译时的运行时路径,以便动态链接器在程序启动时找到非标准位置的共享库。

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

我发现了一些信息,Mac OS X GCC从10.5开始就支持-rpath,也就是从2008年开始。

我试图用一个最小的例子来实现它——但没有成功:

1
2
3
4
5
$ cat blah.c
int blah(int b)
{
  return b+1;
}

还有:

1
2
3
4
5
6
7
8
9
10
11
12
$ cat main.c

#include <stdio.h>

int blah(int);

int main ()
{
  printf("%d
", blah(22));
  return 0;
}

编译如下:

1
2
3
$ gcc -c  blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd`  -Xlinker -rpath -Xlinker `pwd`/t

现在测试:

1
2
3
4
5
6
7
$ 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是可行的-但我不想使用这个黑客。

编辑:关于otool -L

1
2
3
4
$ 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只打印可执行文件链接的库名(以及链接时的位置),没有运行时路径信息。


通过实验发现,并检查xcode为Dave Driblin的参考rpath演示项目生成的命令行:

otool -L显示链接库的安装名称。要使@rpath工作,需要更改库的安装名称:

1
2
3
$ 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`