为什么 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
相同的功能,除了单个二进制文件的粒度,并且以一种可以分发的方式。
谁能解释为什么 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
相同的功能,除了单个二进制文件的粒度,并且以一种可以分发的方式。