QTIFW(Qt Installer Framework)打包设计流程

张开发
2026/4/18 12:03:16 15 分钟阅读

分享文章

QTIFW(Qt Installer Framework)打包设计流程
本文记录如何将项目打包为安装软件从而在其他用户电脑上安装本产品的项目打包方法采用的主要是QT架构中的QTIFWQt Installer Framework打包方法。并且介绍了其中某些关键实现。1. 安装Qt Installer Framework首先需要通过Qt Maintenance Tool工具安装QTIFWQt Installer Framework这个组件这个组件中的核心工具binarycreator.exe将应用程序的可执行文件、资源文件、动态链接库等打包成安装包并允许自定义安装过程(比如添加授权协议、选择安装路径、自定义安装界面等)。Qt Installer Framework官方链接2.构建打包目录结构给项目打包需要在项目根目录下的build目录中编写构建脚本同时还需要有严格的打包目录层次结构若结构不对会导致打包失败。项目中的目录结构层次如下项目|--build|--build.bat|--build.sh|--build_and_package.bat|--build_and_package_new.sh|--package|--config|--config.xml|--config.xml.in|--controller.qs|--style.qss|--packages|--main_component|--data|--meta|--LPE_component|--data|--meta|--MBE_component|--data|--meta|--MPI|--data|--meta|--Ubuntu_MPI|--data|--meta|--Kylin_MPI|--data|--meta|--OpenEuler_MPI|--data|--meta|--default.desktop|--pathFind.bat|--pathFind.sh2. build目录2.1 windows打包脚本windows打包分为两个部分build.bat、build_and_package.bat其中build.bat为构建脚本重新编译项目中的代码可以接受Debug/Release两个参数在build_and_package.bat脚本中调用build.bat脚本进行编译并进行打包。打包的核心语法如下2.2 Linux打包脚本Linux打包和windows类似但是打包因为依赖库的原因不能全部使用QTIFW来完成打包若只用QTIFW提供的指令执行打包会导致项目中某些库的缺失因此需要引入linuxdeployqt共同完成打包。Linux打包注意点1.在静态库中会有一些软连接这些软连接在包安装后如果将安装目录转移则会失效因此需要查找这些软连接然后删除。2.通过linuxdeployqt打包Linuxdeployqt打包生成的最终产物是一个AppImage的可执行程序但这不是我们想要的我们这个打包的中间产物也就是使用linuxdeployqt打包后生成的插件文件和目录层级而不是使用linuxdeployqt打包的最终产物AppImage这样可以避免许多问题 问题一直接使用AppImage程序的目录层级丢失不易查看AppImage就是一个整体的可执行程序。 问题二体积变大如果有多个类似光电项目的子程序公用部分会累计因为每个子项目的公共部分都被AppImgae打包一次导致安装体积越来越大。 问题三对于.db数据库文件等均需要有明确的目录结构进行访问直接使用AppImage,就会导致无法访问数据结构的问题从而材料数据库无法加载。日志文件可能也会受到影响。3. 在使用linuxdeployqt打包后需要通过rpath重新执行依赖库的路径。生成安装程序补充说明其实直接使用linuxdeployqt打包的中间产物然后拷贝到data目录中安装是最简单的打压缩包的脚本hgd_build_and_package.sh就是这么做的build_and_package_new.sh要制作交互式的安装程序因此会有一些目录内容的变更比如可执行程序的文件位置变动这就需要将一些可执行程序的依赖路径进行指定。6. Config目录Config目录中可以放三种文件如下config.xml、controller.qs、style.qss6.1 config.xml文件这个.xml文件用来定制QTIFW安装界面的名称、版本号、标签、安装目录、风格、颜色、安装界面大小、开始菜单目录、控制脚本等。config.xml.in是config.xml的模板文件在代码中用于生成config.xml6.2 controller.qs文件这个文件对界面做一些定制操作比如让证书检查页面不显示重新指定TargetDirectoryPage页等。6.3 style.qss文件这个文件用来定制界面风格和qt的使用方式一样被config.xml文件调用。要注意一点在调整该界面时可能导致Windows/Linux表现形式不一致比如界面和控件的大小这个可以通过使用px像素单位来解决之前遇到过在Linux上面安装界面的右下角按钮缺失一角这个需要使用margin: 0px 20px;来调整间距解决。7. packages目录该目录是安装程序的核心控制功能。主要是对安装组件的控制安装内容的控制。安装的库文件、可执行程序、安装的环境均在该目录中。该目录目前的结构形式是|--packages|--main_component|--data|--meta|--auto_uninstall.qs|--installscript.qs|--package.xml|--package.xml.in|--targetwidget.ui xxx.png|--A_component|--data|--meta|--installscript.qs|--package.xml|--package.xml.in|--B_component|--data|--meta|--installscript.qs|--package.xml|--package.xml.in|--MPI|--data|--meta|--installscript.qs|--package.xml|--Ubuntu_MPI|--data|--meta|--debs|--installscript.qs|--package.xml|--Kylin_MPI|--data|--meta|--debs|--installscript.qs|--package.xml|--OpenEuler_MPI|--data|--meta|--rpms|--installscript.qs|--package.xml包含主要组件main_component在光电项目中LPE\MBE\MOCVD\WT等子项目均以组件的形式挂在主组件下面MPI系统安装环境也以组件的形式挂在主组件下面。组件的挂载关系由每个组件内部的package.xml指定。7.1 main_component7.1.1main_component在本项目中是其他组件的根节点。1.负责安装界面的输入路径检查2.targetDirectoryPage页的操作控制3.覆盖安装4.自动卸载脚本auto_uninstall.qs5.package.xml其中package.xml指定根节点的名称、版本信息、该节点名、installscript.qs脚本、自定义的targetwidget.ui、默认勾选值等。8. XXX.png这个图片是给Linux环境下生成桌面软连接时提供图标的。8.1 某一组件这里以E为例其中package.xml指定组件名称、描述、版本、时间、树节点名和挂载关系、默认勾选、控制脚本。Installscript.qs实现了在CMake项目中如果关掉MBE,则该组件不会在安装界面显示的效果。Windows桌面快捷方式Linux软链接Linux没有桌面快捷方式一说叫软链接组件的每个data目录中存放的是每个组件真实的库文件和可执行程序等最终安装的时候会将data目录中的内容拷贝到用户电脑的安装目录中。8.2 MPI环境相关组件8.2.1 MPI组件该组件其他具体MPI组件的的根节点在该组件的metainstallscript.qs文件中实现了子组件的使能控制用户不可选中进行勾选同时实现了在Linux环境中自动检测用户Linux环境根据不同的Linux系统自动勾选对应的MPI组件目前支持Kylin、OpenEuler、Ubuntu。1.组件使能控制2.系统环境自检3. 组件自动选择*4. package.xml该文件指定将MPI组件挂载在main_component节点上指定该组件的.qs文件7.3.2 Kylin/OpenEuler/Ubuntu在这三种MPI环境组件中麒麟和Ubuntu使用的时deb离线环境包OpenEuler使用的是rpm包这是由OpenEuler系统决定的它不支持deb包。在脚本中会将各自的离线环境包拷贝到各自对应的data目录中这三个组件的installscript.qs的功能是一样的这里以Kylin为例。在installscript.qs中会先检查系统是否已经安装过MPI环境了如果安装了则不会继续安装。如果没有安装则会将deb包或者rpm包中的组件全部安装到用户环境。在安装的时候不要一个一个安装因为他们之间存在依赖关系如果一个一个安装理不清依赖顺序会导致安装失败直接一次执行安装就能避免这个问题。8. default.desktopdefault.desktop是用来给linuxdeployqt打包来使用的linuxdeployqt打包成功需要有正确的目录层次结构和default.desktop文件。9.pathFind.bat/pathFind.sh该文件是用来查找打包人员的电脑上是否已经安装了Qt Installer Framework会在打包脚本build_and_package.bat、build_and_package_new.sh的开始部分调用检查用户环境若没有安装则退出不会继续后续流程了。

更多文章