MacOSX:如何将依赖项收集到本地包中?

时间:2010-01-19 09:22:22

标签: c++ macos deployment otool

我正在创建一个依赖于其他几个库的插件应用程序(dylib)。这些其他库安装在我的系统上,但不保证安装在任何用户的系统上。所以我需要找到一种方法将依赖项与我的应用程序捆绑在一起。

我发现我可以使用otool列出或更改其他dylib的路径。这将允许创建一个文件夹,捆绑我的插件应用程序和所有需要的依赖项。

然而,手动执行此操作似乎是一项耗时且愚蠢的任务。是否有可用于实现自动化的实用程序?

或许我做错了,这个问题有更好更明显的方法吗?

修改的 我创建了一个script来自动执行大部分任务。

3 个答案:

答案 0 :(得分:14)

使用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的文档指出“当安装名称或路径较大时,要使用此工具,二进制文件应使用ld(1)-headerpad_max_install_names选项构建。”所以请确保在构建库时包含-headerpad_max_install_names命令行选项。

@loader_path与用于加载dylib的二进制文件相关,在本例中为libmyfoo.dylib。如果要查找与启动库加载序列的可执行文件相关的库,请使用@executable_path

答案 1 :(得分:4)

要完成克里斯托弗的回答,这里有一些有用资源的链接:

答案 2 :(得分:3)

Macdylibbundler是一个方便的小工具,可以完全满足要求。在为OSX分发二进制文件时,它确实挽救了我的生命。