1、在项目构建前执行命令
在项目构建前执行命令cmd | 存在问题 |
---|---|
system(cmd) | 存在执行多次的问题,可以参考message函数的QMake Manual说明 |
优化后的表达式如下,这样此命令只会在构建前执行一次:
!build_pass:system(cmd)
2、在链接前后执行,使用QMAKE_PRE_LINK/QMAKE_POST_LINK
QMake Manual中有QMAKE_PRE_LINK/QMAKE_POST_LINK的说明。
在链接执行前执行命令cmd | 在链接执行后执行命令cmd | 存在问题 |
---|---|---|
QMAKE_PRE_LINK += cmd | QMAKE_POST_LINK += cmd | 只有在源码修改导致重新链接成目标文件时才会执行 |
3、在构建前后插入命令
首先需要弄清楚qmake和make的协作过程:
- qmake.exe会解析.pro文件生成makefile文件,生成makefile。
- 之后会调用make工具进行编译链接等构建操作。
这里使用的QMake变量是QMAKE_EXTRA_TARGETS和PRE_TARGETDEPENS变量。具体用法请参考QMake Manual。
理解下面的处理过程需要了解一些makefile知识。
示例
在.pro文件中加入下面语句
# cmds
# 构造自定义生成目标对象
mybuild.target=pre_build_cmds
win32{
mybuild.commands=$$PWD/UpdatePluginLib.cmd
}else{
}
# 加入到自定义目标对象列表中
QMAKE_EXTRA_TARGETS += mybuild# 加入到构建依赖列表最前面,会最先被执行,这里必须写目标对象名称,不能是mybuild
PRE_TARGETDEPS += pre_build_cmds
查看makefile.Debug文件
可以看到目标被加入到构建依赖的最前面了。pre_build_cmd目标的定义可在makefile文件中找到。
同理如果需要在构建完成后执行一些命令,则可以使用QMake对应的变量POST_TARGETDEPS,将自定义生成目标加入到变量中:
POST_TARGETDEPS += after_build_cmds
使用场景
一般子目录项目需要先构建插件或动态库依赖,然后再将输出文件更新到最终的应用程序项目中,参与最终的构建,一般做法是写批处理脚本,然后手动双击更新。有了上述方法后,一切都可以一键构建。
总结
一般使用第三种方法,前提是需要清楚地了解Qt的构建过程,以及makefile的相关知识。