为什么windeployqt输出不需要的文件,如何摆脱它们?

时间:2017-10-13 11:51:46

标签: windows qt deployment mingw building

我被告知“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。

2 个答案:

答案 0 :(得分:1)

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

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

  • 执行项目的发布清理构建并记录构建路径和" 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

答案 1 :(得分:1)

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

Dependency Walker将仅列出由Windows加载和启动的exe所需的DLL。但是在程序运行时,可能会在以后加载其他DLL。当Qt加载像image format plugins

这样的插件时,会发生这种情况

因为它无法事先知道需要什么插件,Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.type.TypeFactory.constructType(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/JavaType; at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.getJavaType(AbstractJackson2HttpMessageConverter.java:314) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.canRead(AbstractJackson2HttpMessageConverter.java:146) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.canRead(AbstractJackson2HttpMessageConverter.java:141) at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.doWithRequest(RestTemplate.java:706) at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:770) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:594) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:357) 部署所有Qt插件(所有与所需DLL相关的插件)。

您可以使用windeployqt等命令行修饰符更改windeployqt的行为方式(请参阅--no-plugins)。

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