我创造一个插件应用程序(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的二进制文件时,一定救了我的命。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top