我有一个库: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
你好,世界
如何实现不必在可执行编译时指定库所在的目标?
最佳答案
我必须承认,我对您想要实现的目标感到有些困惑。使用运行路径搜索路径的全部意义在于加载库的图像定义了加载库时要使用的搜索路径。您要求的是让库定义可执行文件应该在哪里找到它。这可以在不使用运行路径搜索路径的情况下完成,只需将 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
$
该库告诉链接到它的可执行文件如何通过设置它的安装名称来找到它,并且在链接可执行文件以使其在运行时找到库时不需要做任何特殊的事情。
关于macos - 如何在 dylib 中指定 rpath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17202313/