macos - 如何在 dylib 中指定 rpath?

标签 macos ld dylib dyld

我有一个库: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/

相关文章:

c++ - cmake,无法将静态库链接到共享库

c - 通过链接描述文件插入库函数 : other functions cause segfault

c++ - OSX 中的动态链接优先级之间存在冲突吗?

macos - 编译用于链接 OSX 的二进制文件

c# - PInvoke 找到一些函数,但找不到其他函数

c++ - 崩溃后如何处理 "impossible"堆栈跟踪?

objective-c - 在 WebKit 上的 Mac OS 应用程序中启用 WebGL

swift - 什么会导致 Xcode MacOs 应用程序将主包指向 "/Applications/Xcode.app"?

macos - 转换网络接口(interface)名称

c++ - 如何在现代 GNU/Linux 发行版上运行旧的二进制文件?