安装名称
期限安装名称指的是的确切路径.dylib
文件存储在最终用户系统中,以便运行时链接器可以找到并加载动态库。
该名称可以是:
- 绝对的,系统库就是这种情况。它们位于最终用户和开发人员系统上的同一位置。
- 相对的,这是与应用程序捆绑在一起的库的情况。在最终用户的系统上
.dylib
将嵌入到应用程序包中,并且在开发人员系统上它们将预先内置/usr/local
, /opt/local
或其他地方,或者它们将作为应用程序构建的一部分从源代码构建。
后者是主要问题,因为当.dylib
建成后,其安装名称被印入.dylib
由链接器处理,这就是运行时找到并加载它的地方。显然,这在最终用户系统上不起作用,因为该路径仅存在于开发人员的系统上,因此解决方案是使用install_name_tool
修改安装名称将应用程序包放在一起时,库以及引用这些库的可执行文件。
占位符
由于可执行文件/应用程序包可以安装在最终用户系统上的不同位置,因此您可以使用占位符系统来抽象安装名称地点:
-
@executable_path
:主要可执行文件的完整路径。
-
@loader_path
:引用可执行文件的完整路径或.dylib
.
-
@rpath
:在主可执行文件中设置的 RPATH。这也可以使用更改install_name_tool
.
例如,在 macOS 应用程序包中,可执行文件位于TheApp.app/Contents/MacOS/TheApp
图书馆将在TheApp.app/Contents/Frameworks
所以你想使用路径引用库@executable_path/../Frameworks/Library.dylib
.
最好将主可执行文件的 RPATH 设置为@executable_path/../Frameworks
但是,并参考使用的库@rpath/Library.dylib
.
安装名称工具
install_name_tool
有两个主要选项:
-id
:这设置了安装名称 of the .dylib
文件本身并将用作原型安装名称从那时起,当某些东西与.dylib
。你可以“纠正”安装名称构建后立即.dylib
,但是这是一个不寻常的工作流程,因为图书馆如何了解使用它的环境?
-change
:这改变了安装名称 of a .dylib
在引用可执行文件(或 dylib)内。
当-id
名称不匹配.dylib
s 在磁盘上的位置?没有什么。这-change
选项是正确的重要选项,因为一旦运行时链接器找到了.dylib
那么任务就完成了。
为什么有一个-id
到底有什么名字?当然,如果链接器被告知在中查找库dirA
, dirB
, dirC
(using -L
例如)并且它找到了它正在寻找的库那么为什么库本身必须有它的-id
印在里面吗?不知道;这可能是一些古老的废话。
xcode开发工具
显然,您会编写所有这些修复脚本作为构建过程的一部分,不是吗?我已经这样做并发布了它here。请参阅README.md有关如何在 Xcode 中配置它的详细信息。