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

Joe*_*elä 5 c++ macos qt frameworks bundle

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

我添加了以下所有内容xxx.app/Content/Frameworks/,并name_install_tool确保从每个框架中搜索所有内容@executable_path/../Frameworks/并将每个框架同样相互链接。

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

@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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Fra*_*eld 2

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

您可能还想尝试 Qt 附带的“macdeployqt”工具。至少对于不太复杂的部署场景来说效果很好(在 Qt 4 中情况更糟)