我正在创建一个依赖于其他几个库的插件应用程序(dylib)。这些其他库安装在我的系统上,但不保证安装在任何用户的系统上。所以我需要找到一种方法将依赖项与我的应用程序捆绑在一起。
我发现我可以使用otool
列出或更改其他dylib的路径。这将允许创建一个文件夹,捆绑我的插件应用程序和所有需要的依赖项。
然而,手动执行此操作似乎是一项耗时且愚蠢的任务。是否有可用于实现自动化的实用程序?
或许我做错了,这个问题有更好更明显的方法吗?
修改的 我创建了一个script来自动执行大部分任务。
答案 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分发二进制文件时,它确实挽救了我的生命。