【发布时间】:2017-06-26 15:09:03
【问题描述】:
我开始了一个只有 C++ 代码的 Qt 项目,此时一切正常。这是我的配置和部署可执行文件的步骤:
在 Windows10 64 位、x64 处理器、联想 Thinkpad 平板电脑上编程。使用Qt5.9框架和MinGW32bit编译器。
- (1) 我首先构建项目并在我的构建目录的副本上启动
windeployqt.exe。 - (2) 然后,我将每个 DLL 和可执行文件放入一个 Wix 项目中,以制作一个
MSI包。据我所知,这个MSI设置的输出应该只是将文件复制到ProgramFiles目录,并在开始菜单和桌面添加正确的快捷方式。
此时,一切正常。但是从现在开始,QML 代码被添加到项目中(因此一些 OpenGL 依赖插件)。我添加了一个QQuickWidget,它在我的视口上实例化了一个 QML 地理地图对象。在我设法让它在 Windows 上运行后,我无法再获得 独立 * 可执行文件。使用 Qt IDE 运行它可以,但是运行 stand-alone * 可执行文件不能。 (抱歉,如果术语不正确:独立,带有 DLL 和大量文件依赖项)
当所有的 DLL 被复制到可执行文件夹中时,(上面的步骤 1.)应用程序卡在后台,并且什么也没有显示。也没有运行时错误来调试它或找出丢失的 DLL(如果有)。
我的想法是某些 QML 插件未加载,或者 OpenGLES 和 Angle 出现问题,以下是我获得的一些 DLL 作为依赖项:
-
D3Dcompiler_47.dll987654328libgcc_s_dw2-1.dll987654330libstdc++-6.dll987654332Qt5Core.dll987654334Qt5Network.dll987654336Qt5Qml.dll987654338Qt5QuickWidgets.dll987654340Qt5Svg.dll987654342 @在可执行文件的同一级别。 -
qwindows.dll放入“platforms”文件夹,以及其他一些文件夹,例如“qmltooling”、“position”、“platforminputcontexts”...(EDIT 以及看似相关的 QML 插件目录)。李>
我不知道它可能是什么。有人知道吗?
将环境变量 QML_IMPORT_TRACE 设置为 1 时的输出。qt.network.ssl ... 消息不是 qml 跟踪的一部分。自从我添加了 QML 映射后,我总是得到它们,但通过 Qt Creator 运行时似乎不是问题。
QQmlImportDatabase::addImportPath: "C:/Qt/5.9/mingw53_32/qml"
QQmlImportDatabase::addImportPath: "qrc:/qt-project.org/imports"
QQmlImportDatabase::addImportPath: "C:/Users/hermes/Documents/build-MyApplication-Desktop_Qt_5_9_0_MinGW_32bit-Release/src/release"
QQmlImportDatabase::addImportPath: "C:/Qt/5.9/mingw53_32/qml"
QQmlImportDatabase::addImportPath: "qrc:/qt-project.org/imports"
QQmlImportDatabase::addImportPath: "C:/Users/hermes/Documents/build-MyApplication-Desktop_Qt_5_9_0_MinGW_32bit-Release/src/release"
QQmlImports(qrc:/qml.qrc/main.qml)::addLibraryImport: "QtQuick" 2.0 as ""
QQmlImports(qrc:/qml.qrc/main.qml)::importExtension: loaded "C:/Qt/5.9/mingw53_32/qml/QtQuick.2/qmldir"
QQmlImportDatabase::registerPluginTypes: "QtQuick" from "C:/Qt/5.9/mingw53_32/qml/QtQuick.2"
QQmlImports(qrc:/qml.qrc/main.qml)::addLibraryImport: "QtQuick.Controls" 1.4 as ""
QQmlImports(qrc:/qml.qrc/main.qml)::importExtension: loaded "C:/Qt/5.9/mingw53_32/qml/QtQuick/Controls/qmldir"
QQmlImportDatabase::registerPluginTypes: "QtQuick.Controls" from "C:/Qt/5.9/mingw53_32/qml/QtQuick/Controls"
QQmlImports(qrc:/qml.qrc/main.qml)::addLibraryImport: "QtLocation" 5.9 as ""
QQmlImports(qrc:/qml.qrc/main.qml)::importExtension: loaded "C:/Qt/5.9/mingw53_32/qml/QtLocation/qmldir"
QQmlImportDatabase::registerPluginTypes: "QtLocation" from "C:/Qt/5.9/mingw53_32/qml/QtLocation"
QQmlImports(qrc:/qml.qrc/main.qml)::addLibraryImport: "QtPositioning" 5.5 as ""
QQmlImports(qrc:/qml.qrc/main.qml)::importExtension: loaded "C:/Qt/5.9/mingw53_32/qml/QtPositioning/qmldir"
QQmlImportDatabase::registerPluginTypes: "QtPositioning" from "C:/Qt/5.9/mingw53_32/qml/QtPositioning"
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "PluginParameter" => "QDeclarativeGeoServiceProviderParameter" TYPE
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "MapQuickItem" => "QDeclarativeGeoMapQuickItem" TYPE
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "Image" => "QQuickImage" TYPE
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "Rotation" => "QQuickRotation" TYPE
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "Map" => "QDeclarativeGeoMap" TYPE
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "Plugin" => "QDeclarativeGeoServiceProvider" TYPE
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "Connections" => "QQmlConnections" TYPE
QQmlImports(qrc:/qml.qrc/main.qml)::resolveType: "Component" => "QQmlComponent" TYPE
qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_client_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_client_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_1_server_method
qt.network.ssl: QSslSocket: cannot resolve TLSv1_2_server_method
qt.network.ssl: QSslSocket: cannot resolve SSL_select_next_proto
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_next_proto_select_cb
qt.network.ssl: QSslSocket: cannot resolve SSL_get0_next_proto_negotiated
qt.network.ssl: QSslSocket: cannot resolve SSL_set_alpn_protos
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_alpn_select_cb
qt.network.ssl: QSslSocket: cannot resolve SSL_get0_alpn_selected
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_get0_next_proto_negotiated
mincore\com\oleaut32\dispatch\ups.cpp(2128)\OLEAUT32.dll!74865072: (caller: 7486FE4F) ReturnHr(1) tid(2e20) 8002801D Bibliothèque non inscrite.
mincore\com\oleaut32\dispatch\ups.cpp(2128)\OLEAUT32.dll!74865072: (caller: 7486FE4F) ReturnHr(2) tid(2e20) 8002801D Bibliothèque non inscrite.
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_get0_next_proto_negotiated
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_get0_next_proto_negotiated
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_get0_next_proto_negotiated
qt.network.ssl: QSslSocket: cannot call unresolved function SSL_get0_next_proto_negotiated
【问题讨论】:
-
尝试使用
QML_IMPORT_TRACE=1运行应用程序并在此处提供输出。 -
@herme5 你使用了windeployqt 的
--qmldir选项吗?并且你是否部署了windeployqt生成的所有文件夹(包括使用--qmldir时创建的文件夹)? -
@BenjaminT。我改为尝试使用 c++ 命令
QCoreApplication::addLibraryPath("C:/path/to/plugins")。我总是运送windeployqt生成的所有文件夹,但从未尝试过--qmldir。我会看看这个。 -
@king_nak 我尝试运行 Dependency Walker ,除了 API-MS-WIN 缺少依赖项外,它没有报告任何内容。但根据this topic,只要 Windows 动态解决这些问题,就可以忽略它(如果我理解得很好)。
-
您必须开始分析(菜单 > 配置文件 > 开始分析)。这会启动程序并为所有 DLL、符号等生成大量日志。在将所需的 QML 复制到应用程序目录之前,我遇到了类似
QQmlApplicationEngine failed to load component qrc:/main.qml:3 module "QtQuick.Controls.Styles" is not installed的错误