【问题标题】:Qt 5.4 application bundled for OSX crashes when launched为 OSX 捆绑的 Qt 5.4 应用程序在启动时崩溃
【发布时间】:2015-06-13 19:38:07
【问题描述】:

我一直在尝试将我的 Qt 应用程序捆绑为 OSX .app,但在我启动捆绑的应用程序时遇到了奇怪的崩溃。 该应用程序使用 QtCore、QtGui、QtNetwork、QtWidgets、QtMultimedia 和 QtOpenGL 框架,以及 Jack Audio Connection Kit 作为 dylib。

我将所有关注添加到xxx.app/Content/Frameworks/ 并执行name_install_tool 以确保从@executable_path/../Frameworks/ 搜索所有内容并同样将每个框架相互链接。

在对xxx.app/Content/MacOs/xxx 执行otool -L 时,我得到以下信息:

@executable_path/../Frameworks/libjack.0.dylib (compatibility version 1.0.0, current version 1.0.0)
@executable_path/../Frameworks/QtMultimedia.framework/Versions/5/QtMultimedia (compatibility version 5.4.0, current version 5.4.0)
@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork (compatibility version 5.4.0, current version 5.4.0)
@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore (compatibility version 5.4.0, current version 5.4.0)
/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui (compatibility version 5.4.0, current version 5.4.0)
@executable_path/../Frameworks/QtOpenGL.framework/Versions/5/QtOpenGL (compatibility version 5.4.0, current version 5.4.0)
@executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.4.0, current version 5.4.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 104.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

这意味着一切正常,但是当我运行与开发环境分开的捆绑应用程序时,应用程序崩溃:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib          0x00007fff8fca9866 __pthread_kill + 10
1   libsystem_pthread.dylib         0x00007fff85c9a35c pthread_kill + 92
2   libsystem_c.dylib               0x00007fff85670b1a abort + 125
3   org.qt-project.QtCore           0x0000000109819159 qt_message_fatal(QtMsgType, QMessageLogContext const&, QString const&) + 9
4   org.qt-project.QtCore           0x000000010981a611 QMessageLogger::fatal(char const*, ...) const + 161
5   org.qt-project.QtGui            0x0000000109e13307 QGuiApplicationPrivate::createPlatformIntegration() + 6359
6   org.qt-project.QtGui            0x0000000109e1332b QGuiApplicationPrivate::createEventDispatcher() + 27
7   org.qt-project.QtCore           0x0000000109a34b11 QCoreApplication::init() + 113
8   org.qt-project.QtCore           0x0000000109a34a87 QCoreApplication::QCoreApplication(QCoreApplicationPrivate&) + 39
9   org.qt-project.QtGui            0x0000000109e1079e QGuiApplication::QGuiApplication(QGuiApplicationPrivate&) + 14
10  org.qt-project.QtWidgets        0x000000010a43653e QApplication::QApplication(int&, char**, int) + 206

并且不会因缺少框架或 dylib 而崩溃。该程序在使用从 /Users/xxx/Qt/5.4/clang_64/lib 搜索的 Qt 框架的开发机器上运行时运行良好。

同时运行该程序,以便仅从 @executable_path/../Frameworks/ 搜索 libjack dylib 和从 /Users/xxx/Qt/.. 搜索 Qt 库工作正常。所以它不是 libjack(也许)。

如果在运行时加载了一些框架/lib,我怎么知道是什么?但话又说回来,它应该链接到/Users/xxx/Qt/... 并工作?

【问题讨论】:

    标签: c++ macos qt frameworks bundle


    【解决方案1】:

    这不是崩溃,而是故意中止。 qt_message_fatal() 表示在 stderr 上打印了一条错误消息,应该为您提供详细信息。在“控制台”应用程序中检查它。从回溯来看,我假设它找不到平台插件(libqcocoa.dylib)。插件在构建时没有链接,所以 otool 不会显示它们。您必须将平台插件(以及其他需要的插件)与应用程序捆绑在一起,其中 libqcocoa.dylib 转到 Foo.app/Contents/PlugIns/platforms,并在每个插件上运行通常的 install_name_tool 过程。

    您可能还想尝试 Qt 附带的“macdeployqt”工具。这至少适用于不太复杂的部署场景(在 Qt 中是 4 倍更糟)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多