【QT】项目打包与发布安装
文章目录
- 一、引言
- 二、前期准备
- 三、打包QT项目
- 3.1 编译release版
- 3.2 相关依赖打包
- 3.3 打包发布
- 3.4 安装
- 四、打包普通项目
- 五、结束语
一、引言
当Qt程序编写完成通过IDE编译就可以得到对应的可执行程序,这个可执行程序在本地运行是完全没有问题的。因为在本地有Qt环境,程序运行过程中可以加载到相关的动态库。但是如果我们想把这个Qt程序给到其他人使用可能就会出问题了,原因如下:
- 对方本地根本没有Qt开发环境
- 对方本地有Qt开发环境,但是和我们使用的版本不一致
- 对方本地有Qt开发环境并且使用的版本与我们一致,但是没有配置环境变量
诸如此类的情况都会导致我们的程序如果直接发送给对方,对方拿到可执行程序之后无法运行。下面来给大家讲一下解决方案。
本文讨论了Windows下QT项目如何打包成单体式exe程序,并支持一键安装与部署。
二、前期准备
- 操作系统:win10
- 本地已安装QT以及相关开发环境
- 已开发好的QT项目且本地运行无异常
- 安装打包软件:innosetup(一路next即可)。
三、打包QT项目
3.1 编译release版
如果要发布程序,需要切换为Release版本(Debug为调试版本),编译器会对生成的Release版可执行程序会进行优化,生成的可执行程序会更小。
这里以QtCreator为例,截图如下:
编译好之后,去相关的文件夹,把生成的exe程序复制到一个新的空文件夹下:
比如我把它复制到了test目录下。
3.2 相关依赖打包
先找到你的QT环境下的bin目录,一般情况下这个目录会被设置进环境变量中,也就是你编译套件所在的目录。
找不到的看下图:
进入这个bin目录,可以将这个路径设置进环境变量。
关于环境变量,说白了,它就是一些优先级比较高的路径。操作系统运行程序时会先从这些路径中找,如果没有再从其他地方找,找不到就报错。
比如你有个程序叫a.exe,它在C:\ffmpeg-7.1.1-essentials_build\路径下。如果你想在任何地方打开cmd运行这个程序,你就必须要写全路径:C:\ffmpeg-7.1.1-essentials_build\a.exe才能运行,否则跑不起来,但是如果你将他的路径C:\ffmpeg-7.1.1-essentials_build\写进环境变量里,那么你就可以直接打开cmd输入a.exe运行,而不必去写路径。
这个目录下有个qt自带的程序叫 windeployqt.exe ,功能是收集程序的相关依赖。找到它,记住它的路径。
回到之前你放exe程序的那个目录,我上面放的是test目录,按住shift并右键打开powershell终端或者cmd,运行windeployqt.exe程序,后跟你的exe程序:
windeployqt.exe yours.exe
以我举例:
D:\Qt\6.9.0\mingw_64\bin\windeployqt.exe .\spark_player.exe
这样windeployqt.exe会收集你的exe程序的相关依赖并复制到这个文件夹下,运行完之后你就会发现这个目录下多了很多文件。此时,点击打开你的exe程序开能不能运行,能运行就行。不能运行的话会提示你缺的文件,找到这些文件,复制进这个exe程序的目录。(everything全局搜)
最终目标是:你在这个阶段要保证单击你的exe程序他能正常运行。
3.3 打包发布
打开innosetup。
创建项目
填写信息
跟你平时安装的程序一样
由于可执行程序关系的动态库有很多,所以可以直接添加动态库的目录,选中对应的目录之后,如果里边还有子目录会弹出如下对话框,选择是即可,需要包含这些子目录。
给可执行程序关联本地的某种格式的磁盘文件(比如记事本程序会自动关联本地的 .txt 文件),对于我的可执行程序来说无需关联,因此没有做任何设置,直接下一步
安装模式:
英文:
留意一下这里的路径,等会需要去这个目录找生成的单体exe:
这之后会提示你创建一个脚本,下回打包你就可以选中执行脚本重复以上步骤,而不需要这样一步一步点击安装了。
3.4 安装
找到你生成的exe文件,双击安装即可。
第二次你就可以使用最后生成的脚本进行打包了,前几次可能不熟,多来几次就玩透了。
四、打包普通项目
仔细回顾一下上述过程,其实所谓的打包就是先保证这个程序在你本地可用,然后借助第三方软件打包成一个单体式应用程序。同理,打包C++写的普通项目也是一样的流程,这里不再赘述。
这里引申出一个问题:普通项目没有图标有点难看?
这个问题qt里你可以借助于pro文件帮你生成带图标的程序,同理借助于cmake也可以。
具体做法就是写一个.rc文件,文件里指定相应的图标文件路径
例如:app.rc里写上这一句:
IDI_ICON1 ICON "train.ico"
然后cmake编译的时候编译它:
add_executable(${PROJECT_NAME} ${SRC_LIST} app.rc)
之后编译生成的文件就有图标了
五、结束语
enjoy it !
好用的话别忘三连打卡~