2017-10-13 158 views
0

我被告知“windeployqt”实用程序,它应该能够收集正确运行我的Windows Qt应用程序所需的所有Qt/MinGW DLL。所以我试了一下。为什么windeployqt输出不需要的文件,我该如何摆脱它们?

不幸的是我注意到它收集更多的文件,然后需要。我将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。

+0

你是如何援用'windeployqt'的? –

+0

在没有安装任何开发工具的干净机器上打开应用程序,并进入您拥有所有dll的文件夹。选择所有,然后转到+删除,未被应用程序使用的dll将被删除。 –

+0

@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“) –

回答

1

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

Dependency Walker将只列出您需要加载并由Windows启动的exe所需的DLL。但其他DLL可能会在您的程序运行时加载。这种情况尤其是当Qt的加载插件,像image format plugins

,因为它不能事先将需要什么插件知道,windeployqt部署Qt的所有插件(所有这一切都在考虑到所需的DLL相关)。

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

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

+0

由于程序使用的是QWidget类(GUI工具),因此看起来额外的DLL“参与”了。我们使用ist只是为了显示一些文本消息 - 这似乎解释了为什么我们没有任何问题,即使QSvg.dll等丢失。谢谢。 –

1

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

我使用该工具以这种方式:

  • 执行该项目,并记录构建路径释放干净的构建和“EXE”中产生。对于insrance

    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 
相关问题