MacOSX:如何收集依赖关系进入一个当地的包?
-
21-09-2019 - |
题
我创造一个插件应用程序(dylib),取决于几个其他图书馆。这些其他图书馆安装了在我的系统,但是不能保证安装任何用户的系统。所以我需要找到一种方法捆绑的依赖,随着我的应用程序。
我发现我可以利用 otool
列出或改变道路的其他dylibs.这将允许建立一个文件夹束我的插件应用程序和所有需要依赖关系。
但是,做这个手动似乎是一个耗费时间和愚蠢的任务。有没有工具可以来自动化?
或许我这样做是错误的,并有一个更好和更明显的方式对这个问题?
编辑 我创建了一个 脚本 这可自动执行大多数任务。
解决方案
使用install_name_tool使用相对路径在dylib。这样,你可以将它们设置一次,在任何地方安装目录,而无需修改您的库在安装时。
您应该将所有的dylib依赖到一个文件夹中,然后使用install_name_tool设置你依赖于其他dylibs的相对位置。假设你的库libmyfoo.dylib取决于libbar.dylib:
install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib
这样,你的图书馆总是会libbar.dylib在libmyfoo.dylib位于同一目录下。
您可能还需要一些其他dylibs的运行install_name_tool,如果他们互相依赖。
当心,对于 install_name_tool的文档指出,“对于这个工具,当安装名称或rpaths较大二进制应与LD建工作(1)-headerpad_max_install_names选项。”,所以一定要建立时包括-headerpad_max_install_names
命令行选项库中。
@loader_path
是相对于用于加载dylib二进制,在这种情况下,你libmyfoo.dylib。如果你想寻找与启动该库加载程序可执行文件的库使用@executable_path
。
其他提示
Macdylibbundler 是一个方便的小工具,它究竟是干什么的要求。它散发的OSX的二进制文件时,一定救了我的命。