C++ MacOSX:如何将依赖项收集到本地捆绑包中?
我正在创建一个依赖于其他几个库的插件应用程序(dylib)。这些其他库安装在我的系统上,但不保证安装在任何用户的系统上。因此,我需要找到一种将依赖项与我的应用程序捆绑在一起的方法 我发现我可以使用C++ MacOSX:如何将依赖项收集到本地捆绑包中?,c++,macos,deployment,otool,C++,Macos,Deployment,Otool,我正在创建一个依赖于其他几个库的插件应用程序(dylib)。这些其他库安装在我的系统上,但不保证安装在任何用户的系统上。因此,我需要找到一种将依赖项与我的应用程序捆绑在一起的方法 我发现我可以使用otool列出或更改到其他dylib的路径。这将允许创建一个文件夹来捆绑我的插件应用程序和所有需要的依赖项 然而,手动执行此操作似乎是一项耗时且愚蠢的任务。是否有实用程序可用于实现自动化 或者我做错了,有更好更明显的方法解决这个问题 编辑 我创建了一个自动化大部分任务的工具。使用install\u na
otool
列出或更改到其他dylib的路径。这将允许创建一个文件夹来捆绑我的插件应用程序和所有需要的依赖项
然而,手动执行此操作似乎是一项耗时且愚蠢的任务。是否有实用程序可用于实现自动化
或者我做错了,有更好更明显的方法解决这个问题
编辑
我创建了一个自动化大部分任务的工具。使用install\u name\u工具在动态库中使用相对路径。这样,您就可以一次性设置它们,并在任何地方安装该目录,而无需在安装时修改库 您应该将所有动态库依赖项放在一个文件夹中,然后使用install_name_工具设置所依赖的其他动态库的相对位置。假设您的库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_工具
注意,的文档指出“为了使此工具在安装名称或RPATH较大时工作,二进制文件应使用ld(1)-headerpad\u max\u install\u names选项构建”。因此,在构建库时,请确保包含-headerpad\u max\u install\u names
命令行选项
@loader\u path
与用于加载动态库的二进制文件相关,在本例中是libmyfoo.dylib。如果要查找与启动库加载序列的可执行文件相关的库,请使用@executable\u path
。要完成Christopher的回答,请访问以下有用资源的链接: