Qt windeployqt 导致部署不可用

Posted

技术标签:

【中文标题】Qt windeployqt 导致部署不可用【英文标题】:Qt windeployqt results in non-usable deployment 【发布时间】:2018-10-01 05:00:27 【问题描述】:

我正在使用windeployqt 可执行文件来准备我的安装树。该工具将所有必需的(甚至一些不必要的)dll 复制到指定文件夹中,并在 Qt5Core.dll 上修补硬编码路径变量。以下是我执行该工具的方式。

C:\Qt\5.11.2\mingw53_32\bin>windeployqt.exe D:\Imaq D:\Imaq\Imaq.exe 32 bit, debug executable Adding Qt5Svg for qsvgicond.dll Direct dependencies: Qt5Core Qt5Gui Qt5Network Qt5Widgets All dependencies : Qt5Core Qt5Gui Qt5Network Qt5Widgets To be deployed : Qt5Core Qt5Gui Qt5Network Qt5Svg Qt5Widgets Updating Qt5Cored.dll. Updating Qt5Guid.dll. Updating Qt5Networkd.dll. Updating Qt5Svgd.dll. Updating Qt5Widgetsd.dll. Updating libGLESV2d.dll. Updating libEGLd.dll. Updating D3Dcompiler_47.dll. Updating opengl32sw.dll. Updating libgcc_s_dw2-1.dll. Updating libstdc++-6.dll. Patching Qt5Cored.dll... Creating directory D:/Imaq/bearer. Updating qgenericbearerd.dll. Creating directory D:/Imaq/iconengines. Updating qsvgicond.dll. Creating directory D:/Imaq/imageformats. Updating qgifd.dll. Updating qicnsd.dll. Updating qicod.dll. Updating qjpegd.dll. Updating qsvgd.dll. Updating qtgad.dll. Updating qtiffd.dll. Updating qwbmpd.dll. Updating qwebpd.dll. Creating directory D:/Imaq/platforms. Updating qwindowsd.dll. Creating directory D:/Imaq/styles. Updating qwindowsvistastyled.dll. Creating D:\Imaq\translations... Creating qt_ar.qm... Creating qt_bg.qm... . . 从上面的输出来看,该工具似乎正在运行,没有任何错误。但部署后,如果我尝试执行二进制文件,则会显示以下错误。

从错误来看,似乎正在复制错误的 dll。但是,在我的机器上,我只有一个编译器 (mingw53_32),并且这些 dll 没有其他可能的版本。

注意:我使用在线安装程序安装了 Qt,我只选择了 Qt creator 和列表中的 Qt mingw。安装程序中列出的所有其他组件均未选中。我想知道这个问题是否是因为缺少任何组件。

另外,我尝试过像--debug、--compiler-runtime 这样的开关,尽管这些开关似乎与这个问题没有任何关系。任何指针将不胜感激。

【问题讨论】:

我很好奇,为什么要尝试使用调试dlls(如Qt5Widgetsd.dll, Qt5Cored.dll?不应该使用发布dlls吗?您是否在发布中构建了您的应用程序模式? 您可以根据需要使用windeployqt 工具部署调试和发布模式。 _ZdaPvjoperator delete[](void*, unsigned int) - 你忘记实现了吗?运行时可能不提供此运算符。 如何找到映射?还有,我们怎么知道运行时没有提供实现? 要找到映射,你需要一个去解码器,有在线 gcc 去解码器可用。该实现可能由某个运行时提供,但在您运行可执行文件时不可用。您可以从所有捆绑的库中转储符号,您可能会注意到未提供相关符号。 【参考方案1】:

正如我从您的windeployqt 输出中了解到的那样,您正在尝试部署应用程序的调试版本(因为windeployqt.exe 正在复制“Qt5Cored.dll、Qt5Guid.dll、Qt5Networkd.dll”等库)。您应该尝试部署应用的发布版本。

在 Qt creator 中,您会在左下角找到选项,就在运行按钮的上方。在您的项目打开时,可以通过单击左侧工具栏中的“项目”来访问 Debug 和 Release 构建的构建配置。

在Qt5.11.2 windeployqt is not creating finite dependent dll中指定

Qt 5.11.2 与 windeployqt 一起提供了一个选项/标志,用于创建与调试/发布可执行文件相关的依赖项。

用于创建依赖于调试版本的 dll: windeployqt 可执行文件--debug

用于创建依赖于发布版本的 dll: windeployqt 可执行文件--release

【讨论】:

当您尝试部署发布版本时,输出没有区别,除了将复制非调试版本的 DLL 之外。虽然不建议部署调试版本,但并不禁止您这样做。无论哪种方式,发布部署在我的情况下也有同样的问题。

以上是关于Qt windeployqt 导致部署不可用的主要内容,如果未能解决你的问题,请参考以下文章

Qt 最小部署

Jetty部署中tmpdir导致服务不可用问题

Qt打包部署程序自动查找依赖DLL工具windeployqt

如何使 windeployqt 仅包含所需的模块?

Windeployqt 部署除 exe 文件外的所有内容

HBase RegionServer挂掉导致集群不可用问题