OSX部署:第三方库在/ Applications而不是bundle中加载插件(自定义)

时间:2013-04-30 05:02:54

标签: macos qt plugins

我正在尝试为Mac OSX创建应用程序包。我正在使用第三方库(Marble,KDE的一部分,但只为Qt构建)使用自己的自定义插件,我不知道如何处理它。这就是我所做的:

  1. 编译我的包
  2. 使用macdeployqt将Qt库复制到bundle并告诉二进制文件使用这些库库(这似乎将Marble库libmarblewidget.dylib复制到应用程序包,并修复其库依赖项)
  3. 将Marble插件复制到bundle.app/Contents/PlugIns/marble(其中bundle.app是我的包),并使用install_name_tool将它们链接到捆绑包中的Qt和Marble库。
  4. 但是,我的应用程序将无法运行。我用DYLD_PRINT_LIBRARIES = 1运行它来查看加载的内容,直到从/Applications/Marble.app/Contents/MacOS/resources/plugins/插入一个插件而不是从我的bundle中的PlugIns目录加载它。此时,插件尝试加载/ Developer Qt库而不是bundle拷贝(以及我在/ usr / local / lib中的libmarblewidget.dylib的副本),它们都崩溃了。

    我可能误解了这个问题,但在我看来,问题是第三方库(libmarblewidget.dylib)加载了Marble应用程序包插件,然后将所有内容搞砸了。假设我是正确的,有没有办法告诉这个库使用我的应用程序包中的PlugIns目录?我需要重新编译吗?

1 个答案:

答案 0 :(得分:0)

Marble对文件MarbleDirs.cpp中的插件(和数据)位置进行硬编码。插件的预期位置是

bundle.app/Contents/Resources/plugins

和数据:

bundle.app/Contents/Resources/data

只要插件和数据在这些目录中,并且使用install_name_tool修复所有插件的ID和链接,应用程序就可以正常运行,仅链接到捆绑包中的Qt和Marble库。插件是.so文件而不是.dylib的事实似乎不是问题。

在qt.conf中设置插件的价值并不重要,libmarblewidget.dylib将始终在这些位置查找。