为啥 windeployqt 输出不需要的文件,我该如何摆脱它们?

Posted

技术标签:

【中文标题】为啥 windeployqt 输出不需要的文件,我该如何摆脱它们?【英文标题】:Why does windeployqt output files that are not required, and how can I get rid of them?为什么 windeployqt 输出不需要的文件,我该如何摆脱它们? 【发布时间】:2017-10-13 11:51:45 【问题描述】:

我被告知“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 来显示一个简单的窗口。因此,我看不出收集这些 DLL 的原因。

【问题讨论】:

你是如何调用“windeployqt”的? 在没有安装任何开发工具的干净机器上打开应用程序并进入所有 dll 所在的文件夹。全选然后shift+delete,不被app使用的dll会被删除。 @Mohammed Kanan:我在 Qt/MinGW 构建环境中使用 CMake,其中 winqtdeploy 由 _add_custom_command(TARGET $PROJECT_NAME POST_BUILD COMMAND windeployqt --force --debug --no-translations - -dir "$CMAKE_BINARY_DIR/dist/bin" "$PROJECT_NAME.exe") @Angel Risteski:感谢您的精彩提示。但目标是我们的自动构建系统将输出一组适当的二进制文件。 【参考方案1】:

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

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

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

您可以使用诸如--no-plugins 之类的命令行修饰符来更改windeployqt 的行为方式(请参阅windeployqt -help)。

您可以查看 Qt 文档中的Qt for Windows - Deployment,尤其是关于Qt Plugins 的部分。

【讨论】:

似乎附加的 DLL 被“参与”了,因为程序使用的是 QWidget 类(GUI 工具)。我们使用 ist 只是为了显示一些文本消息——这似乎解释了为什么即使 QSvg.dll 等丢失了我们也没有任何问题。谢谢。【参考方案2】:

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

我以这种方式使用该实用程序:

执行项目的release clean build并记录构建路径和生成的“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

【讨论】:

以上是关于为啥 windeployqt 输出不需要的文件,我该如何摆脱它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何为windeployqt设置qml输出目录

Qt windeployqt 导致部署不可用

Qt 最小部署

Linux 发行版上的 windeployqt.exe

Qt:利用windeployqt工具进行打包发布

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