在 Windows 上用命令行来编译 Qt 项目

在公司写 Qt 项目的时候发版本一直很灵车。公司前辈教我怎么发版本的时候都是让我在 QtCreator 里改 version.h 文件里的版本号,然后再重新生成,然后手动去 release 文件夹里拷最新的 exe 出来,拿去签名,签完之后再拷到打包用的文件夹里,再跑 nsis 来生成安装文件。

但是我一直觉得你这样手动去打包是不是不稳定环境太多了,搞错了怎么办?您猜怎么着,人家还真就纯手工打包好几年,一次打包问题都没出现,我只能表示牛啊兄弟。

但是我这种懒逼是不会想要这么仙人的打包方式的,我想要的是我代码写好了提交完了,就开始给我从零编译,编译完了没错了去签名生成安装文件打包之类杂七杂八的,完了之后打开所在文件夹,甚至直接自动帮我发到群里(对没错我们发版本是丢飞书群里的)。对没错就跟这个博客一样,于是我就开始了折腾。

最开始只能用脚本替代一些复制黏贴的工作,因为很显然被 IDE 养废的我并不知道怎么写脚本去编译一个 Qt 项目。最近终于有时间研究了一下这个东西。QtCreator 生成要用命令行替代基本上就两个东西。

首先是编译器的环境变量,用 msvc 的话就在微软 vs 某个奇怪地方有一个 vcvarsall.bat,这个可以在 creator 里的编译器设置里看见具体的路径。要是只知道怎么看 qt 环境,那就先去 Kits 里找到项目正在用的 qt 环境,里面会写清楚用这个环境的时候使用的编译器名称,然后再去编译器选项卡里找到对应的那一个编译器。这个 bat 会把编译这个项目所有要用的 msvc 相关的东西帮你加到你的环境中(一次性的)。

另一个是变量$QTDIR,link 的时候要用到。直接把它设置成你在用的 Qt 环境路径就行。这个如果写 bat 或者别的什么脚本的话我也推荐跟着微软的习惯来,每次运行的时候才把要的东西加进来,而不是啥都丢全局环境变量里。

做完上面两步之后,就直接去 QtCreator 里跑个重新生成,去编译输出窗口里抄他用的命令就行了。

然后因为 msvc 的那个东西是 bat, 所以最好用 cmd 去做这个事情。用 PowerShell 需要研究怎么把 msvc 那堆变量丢到 PowerShell 里,直接在 PowerShell 里跑那个 bat 好像是不会在运行环境里加上那些路径的。

如果微软给 msvc 这个初始化提供了 PowerShell 脚本,那就可以完全使用 PowerShell 来做了。或者还有什么奇奇怪怪的魔法也可以用 bat 做到这个事情。

反正编译脚本用不上什么特殊的 PowerShell 魔法,写成 bat 用 PowerShell 去调用也行。

我终于可以用脚本来在打包版本之前重新编一遍代码了,可以自动改版本号,还能避免各种奇奇怪怪的问题,太爽了。