为什么 windeployqt 输出不需要的文件,我怎样才能摆脱它们?

Why does windeployqt output files that are not required, and how can I get rid of them?

我被告知 "windeployqt" 实用程序,它应该能够正确收集 运行 我的 Windows Qt 应用程序所需的所有 Qt/MinGW DLL。所以我试了一下。

不幸的是,我注意到它收集的文件比必要的多。我将 windeployqt 实用程序收集的文件与 "Dependency Walker" 报告的文件进行了比较。确实需要的文件已经妥善收集,但由于某些原因还收集了以下文件:

Qt5Svg.dll
iconengines\qsvgicon.dll
imageformats\qdds.dll
imageformats\qgif.dll
imageformats\qicns.dll
imageformats\qico.dll
imageformats\qjp2.dll
imageformats\qjpeg.dll
imageformats\qmng.dll
imageformats\qsvg.dll
imageformats\qtga.dll
imageformats\qtiff.dll
imageformats\qwbmp.dll
imageformats\qwebp.dll

该应用程序只处理 QBus 并使用 QWidgets 显示一个简单的 Window。因此,我看不出为什么要收集这些 DLL。

windeployqt 实用程序将解析您的“EXE”文件并确定使用了哪些包,然后相应地复制所需的 DLL。确保在 configured/set 环境中调用该实用程序。

我是这样使用的:

  • 执行项目的发布清理构建并记录构建路径和生成的“exe”。例如

    c:\myApp\release\myApp.exe

  • 创建部署文件夹 // 除了发布构建文件夹//。例如

c:\myApp\deploy

然后从 Qt 命令行实用程序调用该实用程序,如下所示:

- Go to all progrmas --> Qt --> Qt command line utility 
- cd c:\myApp\deploy
- windeployqt --dir . c:\myApp\release\myApp.exe

一个 DLL 没有被 Dependency Walker 列出并不意味着它不是必需的。

Dependency Walker 只会列出 Windows 加载和启动您的 exe 所需的 DLL。但是其他的DLL可能稍后加载,而你的程序是运行。这种情况尤其发生在 Qt 加载像 image format plugins

这样的插件时

因为事先无法知道需要什么插件,windeployqt 部署了所有 Qt 插件(所有插件都与所需的 DLL 相关)。

您可以使用 --no-plugins 等命令行修饰符来改变 windeployqt 的行为方式(参见 windeployqt -help)。

你可以看看Qt for Windows - Deployment in the Qt documentation, in particular the part about Qt Plugins