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 这样的开关,尽管这些开关似乎与这个问题没有任何关系。任何指针将不胜感激。
【问题讨论】:
我很好奇,为什么要尝试使用调试dll
s(如Qt5Widgetsd.dll, Qt5Cored.dll
?不应该使用发布dll
s吗?您是否在发布中构建了您的应用程序模式?
您可以根据需要使用windeployqt
工具部署调试和发布模式。
_ZdaPvj
是 operator 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 导致部署不可用的主要内容,如果未能解决你的问题,请参考以下文章