4

我有一个库:libfoo.dylib。问题在命令中说明:

$ install_name_tool -id "@rpath/libfoo.dylib" libfoo.dylib
$ install_name_tool -add_rpath "@executable_path/" libfoo.dylib
$ gcc -o foo foo.c -lfoo
$ ./foo #<==== 我想让这个工作
dyld:库未加载:@rpath/libfoo.dylib
  引用自:~/./foo
  原因:找不到图片
$ install_name_tool -add_rpath "@executable_path/" foo #<=== 我不想在这里指定查找库的位置
$ ./foo
你好世界

如何实现不必在可执行编译时指定库在哪里的目标?

4

2 回答 2

2

我必须承认,我对你想要达到的目标有点困惑。使用运行路径搜索路径的全部意义在于加载库的图像定义了加载库时要使用的搜索路径。您要求的是库定义可执行文件应该在哪里找到它。这可以在不使用运行路径搜索路径的情况下完成,只需将 dylib 的安装名称设置为适当的值即可。根据您的特定示例,听起来您想将安装名称设置为@loader_path/libfoo.dylib. 考虑以下内容,这与您的示例相同:

$ cat a.c 
int a(void)
{
    return 1;
}
$ cc -install_name "@loader_path/liba.dylib" -dynamiclib -o liba.dylib a.c 
$ cat main.c
#include <stdio.h>

extern int a(void);

int main(int argc, char **argv)
{
    fprintf(stderr, "A: %d\n", a());
    return 0;
}
$ cc -L. -la -o main main.c
$ ./main
A: 1
$ 

该库通过设置其安装名称来告诉链接到它的可执行文件如何找到它,并且在链接可执行文件以使其在运行时找到该库时不需要做任何特别的事情。

于 2013-06-22T08:36:53.857 回答
-1

您唯一需要做的就是告诉链接器在您的二进制文件中添加 rpath。实际上,您告诉gcc以以下方式告诉链接器:

$ gcc -o foo foo.c -lfoo -Wl,-rpath=/some/path

现在,如果你objdump用来查看里面有什么:

$ objdump -x ./foo | less

你会看到类似的Dynamic Section东西RPATH /some/path

如果必须输入相同-Wl,-rpath=...的内容太麻烦,请ld接受该@file选项(我不知道,dyld但我想它也是):

$ echo "-rpath=/some/path" > ./ld-options
$ gcc ./foo.c -o foo -Wl,@ld-options
于 2013-06-20T08:36:52.393 回答