捆绑用于OSX的Qt 5.4应用程序在启动时崩溃

时间:2015-04-08 17:35:41

标签: c++ macos qt frameworks bundle

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

我在.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 /../中搜索jack dylib来自/ Users / xxx / Qt / ..的Frameworks /和Qt库正常工作。所以它不是杰克(也许)。

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

1 个答案:

答案 0 :(得分:1)

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

您可能还想尝试Qt附带的“macdeployqt”工具。这至少对于不太复杂的部署方案(Qt 4次更糟)来说效果很好。