2010-01-19 79 views
13

我正在创建一个取决于其他几个库的插件应用程序(dylib)。这些其他库安装在我的系统上,但不保证安装在任何用户的系统上。所以我需要找到一种方式将依赖与我的应用程序捆绑在一起。MacOSX:如何将依赖关系收集到本地包中?

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

但是,手动执行此操作看起来像是一项耗时且笨拙的任务。是否有可用的实用程序来自动化它?

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

编辑 我创建了一个script,自动化大部分任务。

回答

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 

这样,你的图书馆总是会libbar.dylib在libmyfoo.dylib所在的同一目录中。

您可能还需要在某些其他dylib上运行install_name_tool(如果它们互相依赖)。

当心,为install_name_tool的文件指出,“对于这个工具,当安装名称或rpaths较大二进制应与LD建工作(1)-headerpad_max_install_names选项。”,所以一定要包括构建库时的命令行选项-headerpad_max_install_names

@loader_path是相对于用来加载dylib的二进制文件,在这种情况下是您的libmyfoo.dylib。如果您想查找与启动库加载顺序的可执行文件相关的库,请使用@executable_path

+0

请注意,这是一个自动接受的赏金答案。据推测,这实际上并没有解决提问者的问题。 – 2010-02-03 22:02:16

3

Macdylibbundler是一个方便的小工具,它究竟是干什么的要求。当为OSX分发二进制文件时,它确实挽救了我的生命。

相关问题