0

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

  1. 编译我的包
  2. 使用 macdeployqt 将 Qt 库复制到包并告诉二进制文件使用这些库库(这似乎将 Marble 库 libmarblewidget.dylib 复制到应用程序包,并修复其库依赖项)
  3. 将 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 目录?我需要重新编译它吗?

4

1 回答 1

0

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 将始终在这些位置查找。

于 2013-05-03T03:01:51.137 回答