乐于分享
好东西不私藏

使用Qt框架制作Windows上的安装包

使用Qt框架制作Windows上的安装包

当开发者将Qt工程编译成可执行文件后,拷到客户电脑上无法运行,提示缺少各种各样的动态库(dll文件),无法直接运行。

实际上开发者应该将Qt工程编译出的可执行文件和所依赖的动态库放在一起,通过Qt框架做成一个安装包。客户拿到安装包后,安装到自己电脑上,便可正常使用。

Qt官方提供了一格打包框架,通过官方提供的方案可满足多数人的需求。这里便介绍如何通过Qt框架实现打包。

一、下载并安装打包框架安装包

Qt Installer Framework

https://download.qt.io/official_releases/qt-installer-framework/

二、创建目录结构

这里在E盘中创建一个名为installer_root_dir的目录,并在其下创建config及packages两个目录。config目录放置该安装包的总体配置文件,配置信息包括:安装时的界面样式,名称,所有者,图片,安装路径等,如这里config目录下提供了config.xml、logo.png、style.qss、watermark.png文件。

E:\installer_root_dir>tree /f文件夹 PATH 列表卷序列号为 86B7-2311E:.├─config│      config.xml│      logo.png│      style.qss│      watermark.png└─packages    ├─com.company.project1    组件1    │  ├─data    │  │      test.exe    │  │    │  └─meta    │          installscript.qs    │          package.xml    │    └─com.company.project2    组件2【如有需要,可添加多个组件】        ├─data        │      test2.exe        │        └─meta                installscript.qspackage.xml

packages目录下存放实际的安装组件及相关组件元信息,每个组件使用一个单独的目录,比如这里的com.company.project1,其下有data和meta目录,分别存放实际安装的可执行文件及其依赖库文件和相应的组件元数据。

三、加入可执行文件的依赖文件

假设你的Qt工程编译出的二进制为test.exe,将该文件放置到E:\installer_root_dir\packages\com.company.project1\data目录下,使用windeployqt命令将test.exe所需的依赖库加入进来。

E:\installer_root_dir\packages\com.company.project1\data>windeployqt test.exeE:\installer_root_dir\packages\com.company.project1\data\test.exe 64 bit, release executableAddingQt5Svg for qsvgicon.dllSkippingplugin qtvirtualkeyboardplugin.dll due to disabled dependencies (Qt5Qml Qt5Quick).Skippingplugin qtvirtualkeyboard_hangul.dll due to disabled dependencies (Qt5Qml Qt5Quick).Skippingplugin qtvirtualkeyboard_openwnn.dll due to disabled dependencies (Qt5Qml Qt5Quick).Skippingplugin qtvirtualkeyboard_pinyin.dll due to disabled dependencies (Qt5Qml Qt5Quick).Skippingplugin qtvirtualkeyboard_tcime.dll due to disabled dependencies (Qt5Qml Qt5Quick).Skippingplugin qtvirtualkeyboard_thai.dll due to disabled dependencies (Qt5Qml Qt5Quick).Directdependencies: Qt5Core Qt5Gui Qt5Multimedia Qt5Network Qt5WidgetsAlldependencies   : Qt5Core Qt5Gui Qt5Multimedia Qt5Network Qt5WidgetsTobe deployed     : Qt5Core Qt5Gui Qt5Multimedia Qt5Network Qt5Svg Qt5WidgetsUpdatingQt5Core.dll.UpdatingQt5Gui.dll.UpdatingQt5Multimedia.dll.UpdatingQt5Network.dll.UpdatingQt5Svg.dll.UpdatingQt5Widgets.dll.UpdatinglibGLESv2.dll.UpdatinglibEGL.dll.UpdatingD3Dcompiler_47.dll.Updatingopengl32sw.dll.Updatinglibgcc_s_dw2-1.dll.Updatinglibstdc++-6.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/audio.Updatingqtaudio_windows.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/bearer.Updatingqgenericbearer.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/iconengines.Updatingqsvgicon.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/imageformats.Updatingqgif.dll.Updatingqicns.dll.Updatingqico.dll.Updatingqjpeg.dll.Updatingqsvg.dll.Updatingqtga.dll.Updatingqtiff.dll.Updatingqwbmp.dll.Updatingqwebp.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/mediaservice.Updatingdsengine.dll.Updatingqtmedia_audioengine.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/platforms.Updatingqwindows.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/playlistformats.Updatingqtmultimedia_m3u.dll.Creatingdirectory E:/installer_root_dir/packages/com.company.project1/data/styles.Updatingqwindowsvistastyle.dll.CreatingE:\installer_root_dir\packages\com.company.project1\data\translations...Creatingqt_ar.qm...Creatingqt_bg.qm...Creatingqt_ca.qm...Creatingqt_cs.qm...Creatingqt_da.qm...Creatingqt_de.qm...Creatingqt_en.qm...

这一步需要注意的是,可能会有部分库未添加进来,需要将data目录拷到一个新装Windows的系统下,执行test.exe文件,即可报出缺少哪些依赖库。这时从Windows系统目录下寻找该依赖库加入到该目录,继续在新的Windows系统测试,直到不报缺少依赖库为止。(备注:Qt 6不存在该问题)

四、编辑配置文件

需要编辑的文件并不多,一般为config目录下的安装包配置文件config.xml及组件元数据文件。

4.1、配置config目录下文件

config.xml内容如下【可根据实际自定义】

<?xml version="1.0" encoding="UTF-8"?><Installer><Name>我的工程 测试版</Name><Version>1.0</Version><Title>我的工程 测试版</Title><TitleColor>#000000</TitleColor><Publisher>我的公司名称</Publisher><ProductUrl>我的公司网址</ProductUrl><Logo>logo.png</Logo>   logo图片【可选】<Watermark>watermark.png</Watermark>    水印图片【可选】<AllowNonAsciiCharacters>true</AllowNonAsciiCharacters><WizardStyle>Classic</WizardStyle>  <StyleSheet>style.qss</StyleSheet>   安装包界面采用的样式表文件【可选】<WizardDefaultWidth>180ex</WizardDefaultWidth>   安装包界面默认宽度  <WizardDefaultHeight>130ex</WizardDefaultHeight>   安装包界面默认高度  <WizardShowPageList>false</WizardShowPageList>    是否显示左侧导航栏【默认显示】<StartMenuDir>我的工程</StartMenuDir>    开始菜单目录名称<TargetDir>@rootDir@/Program Files/我的安装路径</TargetDir><AdminTargetDir>@rootDir@/我的安装路径</AdminTargetDir></Installer>

style.qss文件内容如下【可根据实际自定义】

QWidget{font13px'Microsoft YaHei';background-color#E0E0E0;}QPushButton{background-color#05988C;color#ffffff;border: none;border-radius4px;height25px;min-width45px;padding-left12px;padding-right12px;}QPushButton:pressed, QPushButton:hover{background#05B8fC;}QProgressBar {border1px solid gray;border-radius2px;text-align: center;}

在config目录下需要存放config.xml文件中需要的样式表文件及图片,如logo.png和watermark.png,否则相关配置无效。

4.2、配置组件元数据文件

可根据需要添加多个组件,每个组件存放各自独立的文件夹下,组件元数据存放在各自组件目录下的meta目录下,如这里组件1的元数据存放在E:\installer_root_dir\packages\com.company.project1\meta目录。

本例中组件元数据package.xml文件内容如下

<?xml version="1.0" encoding="UTF-8"?><Package><DisplayName>我的组件1</DisplayName><Description>我的组件1的描述信息</Description>    <Version>1.0</Version>    <ReleaseDate>2023-07-21</ReleaseDate><Default>true</Default><Script>installscript.qs</Script>     安装该组件时执行的脚本</Package>

installscript.qs文件内容如下

function Component(){}Component.prototype.createOperations = function(){// call default implementation to actually install README.txt!    component.createOperations();if (systemInfo.productType === "windows")    {        这里主要创建开始菜单快捷方式和桌面快捷方式        component.addOperation("CreateShortcut""@TargetDir@/test1.exe""@StartMenuDir@/test1.lnk");        component.addOperation("CreateShortcut""@TargetDir@/test1.exe""@DesktopDir@/test1.lnk");        安装该组件时执行批处理文件,需将该批处理文件存放在data目录下        component.addOperation("Execute""@TargetDir@/my.bat");    }}

五、生成安装包

生成安装包前需要先安装Qt安装包框架。安装后在该测试安装包路径根目录下执行打包命令即可。

E:\installer_root_dir>C:\Qt\QtIFW-4.6.0\bin\binarycreator.exe -c config/config.xml -p packages install.exe -vbinarycreator.exe的具体路径根据实际情况而定。

至此,安装包制作完成。

六、执行安装

安装后在Windows系统的控制面板\程序\程序和功能可查看到本安装包信息。