为什么 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。
我被告知 "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。