Jenkins系列:5、wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe

5 篇文章 1 订阅
5 篇文章 0 订阅

Jenkins系列:5、wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe


1. 前言

之前我们已经总结过使用wsl下的Jenkins来自动编译打包go程序和Java程序,接下来我们继续总结一下编译打包Qt程序。

2. 基本思路

基本思路都是类似的,将原有的分散的编译打包过程的命令配置到Jenkins任务中周期定时性或触发式调用即可,而Qt一般我们都是通过qmake编译的(也可能通过cmake编译,比如使用CLion开发Qt:https://blog.csdn.net/weixin_39510813/article/details/115482634),所以编译过程添加到Jenkins是比较简单的,找到原本Qt项目的编译命令然后添加到Jenkins编译命令即可,如果是Windows下的就使用bat命令,如果是像我这样使用wsl的则可能需要看一下之前提到的如何在wsl调用Windows下的命令,之后再通过打包方式再某个目录将生成的release程序打包成exe,这个过程可能需要提前生成inno steup的脚本,之后调用windeployqt添加依赖库,再将依赖和release文件通过inno setup打包成exe即可,至于触发方式还是使用定时触发(github和Jenkins的推送时触发需要公网对公网,我们本地安装Jenkins进行测试的话需要配置内网穿透,比较麻烦,所以暂时还是使用定时触发方式)。

综上,编译、打包、触发如下:

编译:qmake/camke命令shell或bat调用,一般使用Qt creator我们都是使用qmake;
打包:windeployqt对release程序运行添加依赖库等,inno setup等三方工具将依赖和程序以及协议和证书等同一打包exe;
触发方式:定时触发,如果有公有云的话可以直接安装相关环境到公有云,然后配置webhook进行提交代码后触发。

3. 编译Qt项目及注意事项

3.1 编译Qt项目

先在Qt creator上执行一遍,看一下编译输出来确认会执行哪些命令,然后我们将这些命令按照之前编译go和Java程序的方式放到Jenkins的编译命令那里即可,如下图所示:

在这里插入图片描述

12:24:14: 为项目read_id_card执行步骤 ...
12:24:14: 正在启动 "D:\Qt5.9.1\5.9.1\mingw53_32\bin\qmake.exe" D:\CProjects\read_id_card\read_id_card.pro -spec win32-g++

Info: creating stash file D:\CProjects\build-read_id_card-Desktop_Qt_5_9_1_MinGW_32bit-Release\.qmake.stash
12:24:15: 进程"D:\Qt5.9.1\5.9.1\mingw53_32\bin\qmake.exe"正常退出。
12:24:15: 正在启动 "D:\Qt5.9.1\Tools\mingw530_32\bin\mingw32-make.exe" qmake_all

mingw32-make: Nothing to be done for 'qmake_all'.
12:24:16: 进程"D:\Qt5.9.1\Tools\mingw530_32\bin\mingw32-make.exe"正常退出。
12:24:16: 正在启动 "D:\Qt5.9.1\Tools\mingw530_32\bin\mingw32-make.exe"
...
12:24:22: 进程"D:\Qt5.9.1\Tools\mingw530_32\bin\mingw32-make.exe"正常退出。
12:24:22: Elapsed time: 00:08.

所以主要是以下几个命令:

qmake.exe D:\CProjects\read_id_card\read_id_card.pro -spec win32-g++
mingw32-make.exe qmake_all
mingw32-make.exe

为了模拟整个Qt creator的编译过程,我们将创建文件夹等过程也加入进来,此外,wsl执行Windows的命令对路径也有一些小要求,最终一个简单的在wsl上编译Windows下Qt项目的shell脚本如下:

cd /mnt/d/CProjects/
mkdir build-read_id_card-Desktop_Qt_5_9_1_MinGW_32bit-Release
cd build-read_id_card-Desktop_Qt_5_9_1_MinGW_32bit-Release
# wsl执行Windows命令注意路径加双引号
qmake.exe "D:\CProjects\read_id_card\read_id_card.pro" -spec win32-g++
mingw32-make.exe qmake_all
mingw32-make.exe

结果如下:

在这里插入图片描述

当然,上述脚本可以将项目名称提取成变量,将整个过程提取成函数更好一些,针对debug和release也做一下区分,这里我暂时就不做优化了。

3.2 注意事项

最后一步编译时有时会出现如下错误:

release/main.o:main.cpp:(.text+0x2e): undefined reference to `__imp__ZN12QApplicationC1ERiPPci'
...

在这里插入图片描述

这个是由于我安装了好几个mingw,默认Qt的mingw一般都是32位的,我的一些程序必须使用64位的mingw,所以这里调用mingw相关命令时使用错了mingw,因此如果你也出现类似问题,可以看一下你的mingw版本情况。

像我这里修改后加入到Windows的PATH之后会如下所示,需要保证使用的是Qt自带的mingw,因为一些Qt相关的库是经过其自带的mingw编译的,如果找不到就会提示上面的"undefined xxx"。因此,如果使用的不是Qt自带的mingw,要么用你使用的mingw编译一下相关的库或者Qt,要么切换一下你正在使用的mingw(更改Windows下PATH中的mingw的bin目录位置即可):

zy@LS2-R910CQQT:/mnt/d/CProjects$ mingw32-make.exe -v
GNU Make 4.1
Built for i686-w64-mingw32
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
zy@LS2-R910CQQT:/mnt/d/CProjects$ which mingw32-make.exe 
/mnt/d/Qt5.9.1/Tools/mingw530_32/bin/mingw32-make.exe

4. 打包Qt项目

我这里是使用的windeployqt获取release程序的依赖,然后使用三方工具inno setup将其打包成exe即可,不清楚的可以看这里:https://blog.csdn.net/weixin_39510813/article/details/105013247

之后我们将这个过程命令化(这其中安装inno setup和创建编译的.iss的过程暂时不好自动化,还是需要按照上面的总结自己创建一个)。

cd /mnt/d/CProjects/
mkdir packReadIDCard
cd packReadIDCard
cp /mnt/d/CProjects/build-read_id_card-Desktop_Qt_5_9_1_MinGW_32bit-Release/release/read_id_card.exe ./
windeployqt.exe read_id_card.exe

之后将生成的部署依赖和程序通过inno setup生成打包的.iss脚本,后续我们再打包就只需要运行该脚本即可。

将inno setup的安装路径添加到PATH中,之后使用其自带的命令行命令执行生成的.iss脚本即可打包exe:

在这里插入图片描述

然后运行命令:

ISCC.exe packReadIDCardScript.iss

在这里插入图片描述

5. 创建Jenkins构建任务

创建自由风格项目:

在这里插入图片描述

勾选钉钉机器人:

在这里插入图片描述

提供git地址和用户名密码等;

定时构建:

在这里插入图片描述

构建-执行shell:

shell暂时就不优化了,等到实际项目中专人负责优化一下即可:

cd /mnt/d/CProjects/
mkdir build-read_id_card-Desktop_Qt_5_9_1_MinGW_32bit-Release
cd build-read_id_card-Desktop_Qt_5_9_1_MinGW_32bit-Release
# wsl执行Windows命令注意路径加双引号
qmake.exe "D:\CProjects\read_id_card\read_id_card.pro" -spec win32-g++
mingw32-make.exe -v
mingw32-make.exe qmake_all
mingw32-make.exe
cd /mnt/d/CProjects/
mkdir packReadIDCard
cd packReadIDCard
cp /mnt/d/CProjects/build-read_id_card-Desktop_Qt_5_9_1_MinGW_32bit-Release/release/read_id_card.exe ./
windeployqt.exe read_id_card.exe
cd ..
ISCC.exe packReadIDCardScript.iss

在这里插入图片描述

6. 结果

如果没问题的话钉钉会提示构建成功:

在这里插入图片描述

在这里插入图片描述

并且在read_id_card的同级目录下Output文件夹中会生成打包好的exe文件:

在这里插入图片描述

这个exe文件我们还可以扩展上传到公网服务器,然后开放部分文件夹直接提供ftp下载等。

6. 最后

后面应该还有一个前后端的提交、构建、测试和发布的总结,但是不确定什么时候弄,我把网站迁到阿里云之后域名国内需要备案,这个就有点烦,所以暂时就没有做个人网站升级改造,暂时又把域名关联到GitHub page了,等后续看要不要开发个公众号然后维护公有云上的微信公众号来做下测试。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值