为什么 macOS 上的动态库有一个 id?

Why do dynamic libraries on macOS have an id?

谁能解释为什么 macOS 上的动态库有一个 id,而且它总是一个路径?我可以通过 install_name_tool 更改此 id 但为什么这是必要的?

我不记得 Linux 上有这个。为什么苹果在初始化时决定不通过加载路径的路径?

$ otool -L /path/to/lib/libgobject-2.0.0.dylib
/path/to/lib:
    @loader_path/libgobject-2.0.0.dylib <--- ??? (compatibility ...)
    .. other dependencies

因为“标准路径”对于 macOS 来说还不够。

在 Linux 上,库由 $(basename $path) 标识,所有内容都放在 /usr/lib 或其他一些标准路径中。如果两个库发生冲突,那就是你的问题。如果您没有 root 权限,那是您的问题。如果你想测试一些东西,你至少可以设置 LD_LIBRARY_PATH,但对于分发来说真的不是很好。

现在考虑 macOS(并扩展为 iOS),其中 /usr/lib 位于只读卷上,应用程序通常在其 .app 包中提供第三方框架,并期望它们能够正常工作不管磁盘上的路径如何,也不需要 root 来安装。

macOS 上的共享库有一个 ID,它是一个路径,因为该路径告诉运行时链接器在磁盘上的何处查找库。
现在您可能会问为什么它不直接嵌入库的编译时路径?一方面,因为整个应用程序包可能会四处移动,另一方面,因为交叉编译是一回事。

本质上,这提供了与 LD_LIBRARY_PATH 相同的功能,除了单个二进制文件的粒度,并且以一种可以分发的方式。