使用Qt Creator时,项目经常需要在编译前或者编译后复制部分文件,在项目pro文件增加相应的指令
命令:
QMAKE_PRE_LINK 编译前执行
QMAKE_POST_LINK 编译后执行
方法一:
直接添加命令,使用&连接多条指令,例如:
win32{
# 复制dll目录下所有文件和子目录(包含空目录),以修改时间判断,如果文件更新则覆盖,注:源码修改才会触发
QMAKE_POST_LINK += xcopy /D /F /E /Y \"$${PWD}/XXX/dll\" \"$${DESTDIR}\"
QMAKE_POST_LINK += & xcopy /D /F /E /Y \"$${PWD}/XXXXX/dll\" \"$${DESTDIR}\"
}
记录一下:
cmd命令的特殊字符:
| 命令管道符,前一条命令的输出作为下一条命令的输入
& 无论前一条命令执行结果如何继续执行下一条命令
&& 组合命令,前一条命令失败则不会执行下一条
|| 组合命令,前一条命令成功则不会执行下一条
方法二:
添加一个BAT文件,用于执行较多的命令,不过BAT文件中不能使用$${DESTDIR}
win32{
# 编译后执行bat文件
QMAKE_POST_LINK += $${PWD}/afterCompileRun.bat
}
BAT文件记录一下:
rem 关闭命令回显
@echo off
rem 显示当前路径
echo 当前路径:%cd%
rem 显示bat文件路径,末尾包含\
echo BAT文件目录:%~dp0
rem 创建目录
rem mkdir "%~dp0..\bin"
rem 复制dll目录下所有文件和子目录(包含空目录),以修改时间判断,如果文件更新则覆盖,注:源码修改才会触发
xcopy /D /F /E /Y "%~dp0XXX\dll" "%~dp0..\bin"
方法三:
# $$escape_expand("\\n\\t")可用来分隔不同指令
win32{
# 复制dll目录下所有文件和子目录(包含空目录),以修改时间判断,如果文件更新则覆盖,注:源码修改才会触发
QMAKE_POST_LINK += xcopy /D /F /E /Y \"$${PWD}/XXX/dll\" \"$${DESTDIR}\"
QMAKE_POST_LINK += $$escape_expand("\\n\\t") xcopy /D /F /E /Y \"$${PWD}/XXXXX/dll\" \"$${DESTDIR}\"
}
注意:
源码必须修改上面命令才会被执行,即使只是增删一个空格、空行也可以
“编译输出“可以查看执行结果
在这里贴一个配置在项目生成exe后自动复制QT依赖项到exe目录,放在项目pro文件中
win32 {
# 将QT依赖库和文件复制到exe目录,还会复制vc环境安装包vcredist_x86.exe到exe目录
DEPLOY_TOOL = $${dirname(QMAKE_QMAKE)}/windeployqt.exe
DEPLOY_TOOL = $$replace(DEPLOY_TOOL, /, \\)
contains(CONFIG, debug, debug|release){
DEPLOY_TARGET = $${OUT_PWD}/debug/$${TARGET}.exe
#DEPLOY_TARGET = $${PWD}/../bin/$${TARGET}.exe
}else{
DEPLOY_TARGET = $${OUT_PWD}/release/$${TARGET}.exe
#DEPLOY_TARGET = $${PWD}/../bin/$${TARGET}.exe
}
DEPLOY_TARGET=$$replace(DEPLOY_TARGET, /, \\)
msvc {
# $$escape_expand("\\n\\t")可用来分隔不同指令
QMAKE_POST_LINK+=$$escape_expand("\\n\\t") $${DEPLOY_TOOL} $${DEPLOY_TARGET} --qmldir $$[QT_INSTALL_QML] --force --no-translations $$escape_expand(\\n)
}else{
QMAKE_POST_LINK+='$$escape_expand("\\n\\t") $${DEPLOY_TOOL} $${DEPLOY_TARGET} --qmldir $$[QT_INSTALL_QML] --force --no-translations $$escape_expand("\\n\\t")'
}
# 显示命令
message("alter link execute command:" $$QMAKE_POST_LINK)
}
此段代码参考自开源项目 QtSwissArmyKnife v3.5.0,QtSwissArmyKnife/SAKSetup.pri文件,