我正在创建一个依赖于其他几个库的插件应用程序(dylib)。这些其他库安装在我的系统上,但不保证安装在任何用户的系统上。所以我需要找到一种方法将依赖项与我的应用程序捆绑在一起。
我发现我可以otool
用来列出或更改其他 dylib 的路径。这将允许创建一个文件夹来捆绑我的插件应用程序和所有需要的依赖项。
但是,手动执行此操作似乎是一项耗时且愚蠢的任务。是否有可用于自动化的实用程序?
或者也许我做错了,对于这个问题有更好,更明显的方法?
编辑 我创建了一个自动化大部分任务的脚本。
我正在创建一个依赖于其他几个库的插件应用程序(dylib)。这些其他库安装在我的系统上,但不保证安装在任何用户的系统上。所以我需要找到一种方法将依赖项与我的应用程序捆绑在一起。
我发现我可以otool
用来列出或更改其他 dylib 的路径。这将允许创建一个文件夹来捆绑我的插件应用程序和所有需要的依赖项。
但是,手动执行此操作似乎是一项耗时且愚蠢的任务。是否有可用于自动化的实用程序?
或者也许我做错了,对于这个问题有更好,更明显的方法?
编辑 我创建了一个自动化大部分任务的脚本。
使用 install_name_tool 在你的 dylib 中使用相对路径。这样您就可以设置它们一次,然后将该目录安装在任何地方,而无需在安装时修改您的库。
您应该将所有 dylib 依赖项放在一个文件夹中,然后使用 install_name_tool 设置您所依赖的其他 dylib 的相对位置。假设您的库 libmyfoo.dylib 依赖于 libbar.dylib:
install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib
这样,您的库将始终在 libmyfoo.dylib 所在的同一目录中查找 libbar.dylib。
如果它们相互依赖,您可能还需要在其他一些 dylib 上运行 install_name_tool。
请注意,install_name_tool的文档指出“要在安装名称或 rpath 较大时使用此工具,应使用 ld(1) -headerpad_max_install_names 选项构建二进制文件。”,因此请确保在安装-headerpad_max_install_names
时包含命令行选项建立你的图书馆。
@loader_path
相对于用于加载 dylib 的二进制文件,在本例中是您的 libmyfoo.dylib。@executable_path
如果要查找与启动库加载序列的可执行文件相关的库,请使用。
为了完成克里斯托弗的回答,这里有一些有用资源的链接:
Macdylibbundler是一个方便的小工具,它完全符合要求。在为 OSX 分发二进制文件时,它确实救了我的命。