QT使用windeployqt部署发布及其精简

QT技巧 - QT使用windeployqt部署发布及其精简


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

目录


环境:
QT版本:5.6.2
编译器:VS2013 update 5
系统环境:Windows 7 64bit

相关文章:
Inno setup打包教程


1.前言

QT程序开发完成后,要在没有QT开发环境的系统上部署还是比较难处理的。本文介绍如果快速部署及精简。

2.Windows部署工具

Windows部署工具旨在自动执行创建可部署文件夹的过程,该文件夹包含从该文件夹运行应用程序所需的与Qt相关的依赖关系(库,QML导入,插件和翻译)。 它为Windows运行时创建沙箱或为Windows桌面应用程序创建安装树,可以轻松将其捆绑到安装包中。

该工具可以在QTDIR / bin / windeployqt中找到。 它以.exe文件或包含.exe文件的目录作为参数,并扫描可执行文件的依赖关系。 如果使用–qmldir参数传递目录,则windeployqt将使用qmlimportscanner工具扫描目录中的QML文件以获取QML导入依赖关系。 然后将识别的依赖关系复制到可执行文件的目录中。 Qt5Core.dll中的硬编码本地路径进一步被相关的替换。

应用程序可能需要额外的第三方库(例如数据库库),windeployqt不会考虑这些库。


使用windeployqt最简单的方法是添加Qt的bin目录
安装(例如<QT_DIR \ bin>)到PATH变量,然后运行:
   windeployqt <path-to-app-binary>
如果ICU,ANGLE等不在bin目录中,则需要在PATH中
变量。 如果您的应用程序使用Qt Quick,请运行:
 windeployqt --qmldir <path-to-app-qml-files> <path-to-app-binary>

其他参数在工具的帮助输出中进行了描述:

扫描二维码关注公众号,回复: 1173303 查看本文章
Usage: windeployqt [options] [files]

Options:
  -?, -h, --help            Displays this help.
  -v, --version             Displays version information.
  --dir <directory>         Use directory instead of binary directory.
  --libdir <path>           Copy libraries to path.
  --plugindir <path>        Copy plugins to path.
  --debug                   Assume debug binaries.
  --release                 Assume release binaries.
  --pdb                     Deploy .pdb files (MSVC).
  --force                   Force updating files.
  --dry-run                 Simulation mode. Behave normally, but do not
                            copy/update any files.
  --no-patchqt              Do not patch the Qt5Core library.
  --no-plugins              Skip plugin deployment.
  --no-libraries            Skip library deployment.
  --qmldir <directory>      Scan for QML-imports starting from directory.
  --no-quick-import         Skip deployment of Qt Quick imports.
  --no-translations         Skip deployment of translations.
  --no-system-d3d-compiler  Skip deployment of the system D3D compiler.
  --compiler-runtime        Deploy compiler runtime (Desktop only).
  --no-compiler-runtime     Do not deploy compiler runtime (Desktop only).
  --webkit2                 Deployment of WebKit2 (web process).
  --no-webkit2              Skip deployment of WebKit2.
  --json                    Print to stdout in JSON format.
  --angle                   Force deployment of ANGLE.
  --no-angle                Disable deployment of ANGLE.
  --no-opengl-sw            Do not deploy the software rasterizer library.
  --list <option>           Print only the names of the files copied.
                            Available options:
                             source:   absolute path of the source files
                             target:   absolute path of the target files
                             relative: paths of the target files, relative
                                       to the target directory
                             mapping:  outputs the source and the relative
                                       target, suitable for use within an
                                       Appx mapping file
  --verbose <level>         Verbose level.

Arguments:
  [files]                   Binaries or directory containing the binary.

可以通过传递它们的名称(-xml)或通过传递来删除Qt库
名称前面加上–no-(–no-xml)。 可用的库:
bluetooth concurrent core declarative designer designercomponents
enginio gui qthelp multimedia multimediawidgets multimediaquick network nfc
opengl positioning printsupport qml qmltooling quick quickparticles quickwidgets
script scripttools sensors serialport sql svg test webkit webkitwidgets
websockets widgets winextras xml xmlpatterns webenginecore webengine
webenginewidgets 3dcore 3drenderer 3dquick 3dquickrenderer 3dinput geoservices
webchannel texttospeech serialbus

3.创建程序安装包

要部署应用程序,我们必须确保将相关的Qt DLLs(对应于应用程序中使用的Qt模块)和Windows平台插件qwindows.dll以及可执行文件复制到发行版中的同一目录树子目录。

如果使用动态OpenGL,则还需要包含ANGLE和软件渲染所需的库。 对于ANGLE,来自Qt的lib目录的libEGL.dll和libGLESv2.dll以及来自DirectX的HLSL编译器都是必需的。 HLSL编译器库d3dcompiler_XX.dll,其中XX是ANGLE(libGLESv2)链接的版本号。

如果Qt配置为与ICU或OpenSSL链接,则也需要将相应的DLL添加到发布文件夹中。

请记住,如果您的应用程序依赖于编译器特定的库,则这些库必须与应用程序一起重新分发。 您可以使用依赖工具来检查应用程序链接的库。 有关更多信息,请参阅应用程序依赖项部分。

我们很快会介绍这些插件,但首先我们将检查应用程序是否可以在部署环境中工作:将可执行文件和Qt DLL复制到没有安装Qt或任何Qt应用程序的计算机,或者如果您 想要在构建机器上测试,确保机器在其环境中没有Qt。

如果应用程序启动没有任何问题,那么我们已经成功地创建了Plug&Paint应用程序的动态链接版本。 但是由于我们还没有部署相关的插件,所以应用程序的功能仍然会丢失。

插件对普通DLL的工作方式不同,所以我们不能像我们用Qt DLL那样将它们复制到与应用程序可执行文件相同的目录中。 在寻找插件时,应用程序在应用程序可执行文件的目录内的plugins子目录中搜索。

为了让插件可用于我们的应用程序,我们必须创建plugins子目录并复制相关的DLL:

plugins\pnp_basictools.dll
plugins\pnp_extrafilters.dll

分发运行Plug&Paint应用程序所需的所有Qt DLL和特定应用程序插件的归档文件必须包含以下文件:

类别 文件名称
可执行程序 plugandpaint.exe
基础工具插件 plugins\pnp_basictools.dll
额外插件 plugins\pnp_extrafilters.dll
Qt Windows平台插件 platforms\qwindows.dll
Qt Windows Vista 风格插件 styles\qwindowsvistastyle.dll
Qt核心模块 Qt5Core.dll
Qt GUI模块 Qt5Gui.dll
Qt Widgets模块 Qt5Widgets.dll

根据应用程序使用的功能(iconengines, imageformats),可能需要其他插件。

另外,存档文件必须包含以下编译器特定的库(假设Visual Studio 14.0(2015)或15.0(2017)):

类别 文件名称
The C run-time vccorlib140.dll, vcruntime140.dll
The C++ run-time msvcp140.dll

如果使用动态OpenGL,则存档必须另外包含:

类别 文件名称
ANGLE libraries libEGL.dll, libGLESv2.dll
HLSL compiler library for ANGLE d3dcompiler_XX.dll
OpenGL Software renderer library opengl32sw.dll

最后,如果Qt配置为使用ICU,则归档文件必须包含:

文件名称
icudtXX.dll icuinXX.dll icuucXX.dll

要验证应用程序现在可以成功部署,可以在没有Qt的计算机上提取此归档文件,并且不安装任何编译器,然后尝试运行它。

4.应用程序依赖关系

根据配置的不同,编译器特定的库必须与应用程序一起重新分发。

例如,如果Qt是使用ANGLE构建的,那么它的共享库和DirectX的HLSL编译器也将被发布。

您可以使用Dependency Walker工具检查应用程序链接的库。 所有你需要做的就是像这样运行它:

depends <application executable>

这将提供应用程序依赖的库列表和其他信息。

这里写图片描述

4.QT插件

所有Qt GUI应用程序都需要一个插件来实现Qt 5中的Qt平台抽象(QPA)层。对于Windows,平台插件的名称是qwindows.dll。 该文件必须位于分发目录下的特定子目录(默认情况下为平台)内。 或者,如下所述,可以调整搜索路径Qt用来查找其插件。

您的应用程序也可能依赖于一个或多个Qt插件,如打印支持插件,JPEG图像格式插件或SQL驱动程序插件。 一定要分发你的应用程序所需的任何Qt插件。 与平台插件类似,每种类型的插件都必须位于分发目录中的特定子目录(如printsupport,imageformats或sqldrivers)内。

Qt插件的搜索路径被硬编码到QtCore库中。 默认情况下,Qt安装的plugins子目录是第一个插件搜索路径。 但是,预设路径(如默认路径)有一定的缺点。 例如,它们可能不存在于目标机器上。 出于这个原因,你需要检查各种替代方案以确保找到Qt插件。

5.精简windeployqt的依赖文件

5.1 libEGL libGLESV2 opengl32sw

libEGL.dll, libGLESV2.dll 这两个文件是 ANGLE 的文件,可以去掉。opengl32sw.dll是软件模拟 OpenGL,除非用户的系统连 DirectX 支持都不完整——虚拟机环境就是这样——不然这个文件也完全没有用。 QtWidgets/C++ 程序都不用 OpenGL,所以直接去掉即可。可在调用windeployqt.exe时加–no-angle 和 –no-opengl-sw 这两个参数。

5.2 svg

如果没有使用 svg 的话,iconengines\qsvgicon.dll, imageformats\qsvg.dll, Qt5Svg.dll 这三个文件也可以删掉

5.3 国际化

如果没有国际化用户的话,translations 里面的翻译文件也可以删掉。

5.4 Qt5Widgets

QML 程序没有使用 QtWidgets/C++ 可以删掉 Qt5Widgets.dll

5.5 图像

如果 imageformats 目录里面有几种图像格式没用上,也可以删掉。我自己通常把整个目录都删掉,Qt已经编译了 png 的支持,能读写程序包含的图标就够,其它格式不重要。

经过以上裁剪后,还可以使用 7zip 进行压缩。

6.打包

打包可以参考博文

Inno setup打包教程


Reference:
Qt for Windows - Deployment
谈谈 Qt 程序安装包的大小,以及简要打包指南
Inno setup打包教程

觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
微信
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

猜你喜欢

转载自blog.csdn.net/itas109/article/details/80497065
今日推荐