OSX 部署:第 3 方库在 /Applications 中加载插件(自定义)而不是捆绑
Posted
技术标签:
【中文标题】OSX 部署:第 3 方库在 /Applications 中加载插件(自定义)而不是捆绑【英文标题】:OSX deployment: 3rd party library loads plugins (custom) in /Applications rather than bundle 【发布时间】:2013-04-30 05:02:54 【问题描述】:我正在尝试为 Mac OSX 创建一个应用程序包。我正在使用使用自己的自定义插件的第 3 方库(Marble,KDE 的一部分,但仅为 Qt 构建),我不知道如何处理。这是我所做的:
-
编译我的包
使用 macdeployqt 将 Qt 库复制到包并告诉二进制文件使用这些库库(这似乎将 Marble 库 libmarblewidget.dylib 复制到应用程序包,并修复其库依赖项)
将 Marble 插件复制到 bundle.app/Contents/PlugIns/marble(其中 bundle.app 是我的包),并使用 install_name_tool 将它们链接到包中的 Qt 和 Marble 库。
但是,我的应用程序无法运行。我已经使用 DYLD_PRINT_LIBRARIES=1 运行它以查看正在加载的内容,在加载来自 /Applications/Marble.app/Contents/MacOS/resources/plugins/ 的插件而不是从我的包中的 PlugIns 目录加载之前,一切看起来都很好.此时,插件尝试加载 /Developer Qt 库而不是捆绑包副本(以及我在 /usr/local/lib 中获得的 libmarblewidget.dylib 的副本),这一切都崩溃了。
我可能误解了这个问题,但在我看来,问题在于第 3 方库 (libmarblewidget.dylib) 加载了 Marble 应用程序捆绑插件,然后一切都搞砸了。假设我是对的,有没有办法告诉这个库使用我的应用程序包中的 PlugIns 目录?需要重新编译吗?
【问题讨论】:
如果你在插件dylib上运行otool -L,它是否有插件的路径,你可以用install_name_tool设置? 你的意思是图书馆dylib?无论哪种方式,我都在插件(.so 文件)和库上运行了 otool -L,并且显示的所有内容都在包(@executable_path/../something)或系统(不是 Qt)库中。 您提到了插件(.so 文件)。如果它们是 linux 使用的共享库 .so 文件,那将是一个问题,因为 OSX 不使用这种格式,但有自己的二进制类型,称为 Mach-O。这包含动态链接器 dyld 的头文件,用于修复动态库调用。见这里:developer.apple.com/library/mac/#documentation/DeveloperTools/… 我知道,但这就是 Marble 库编译其插件的方式(甚至在 Mac OSX 上)。只要我不修复我的包以使用包库,它们实际上可以很好地加载 Marble 应用程序以及我的应用程序。这是因为插件的位置基本上是硬编码到库中的。一旦我整理了一些细节,我会发布一个完整的解决方案。 【参考方案1】:Marble 对文件 MarbleDirs.cpp 中的插件(和数据)位置进行硬编码。插件的预期位置是
bundle.app/Contents/Resources/plugins
对于数据:
bundle.app/Contents/Resources/data
只要插件和数据在这些目录中,并且所有插件的 ID 和链接都使用 install_name_tool 修复,应用程序就可以正常运行,只链接到捆绑包中的 Qt 和 Marble 库。插件是 .so 文件而不是 .dylib 的事实似乎不是问题。
插件的值在 qt.conf 中设置为什么无关紧要,libmarblewidget.dylib 将始终在这些位置查找。
【讨论】:
以上是关于OSX 部署:第 3 方库在 /Applications 中加载插件(自定义)而不是捆绑的主要内容,如果未能解决你的问题,请参考以下文章
如何让 TypeScript 从 node_modules 捆绑第 3 方库?
适用于 Android 的 AIR 3 Native Extensions - 我/如何包含第 3 方库?
Mac下安装CoCoaPods及使用CoCoaPods管理第3方库