Qt .pro配置:TEMPLATE=aux模式下如何避免目标文件已存在时重复运行自定义脚本
问题根因定位
- 原配置每次强制执行脚本的核心原因:
PRE_TARGETDEPS绑定的是无实体文件的虚目标mytarget2,make无法对这类目标做时间戳/存在性校验,会永远判定它需要重建,连带触发所有关联命令 TEMPLATE = aux模式下没有内置的编译流程逻辑,qmake不会自动为自定义目标生成文件存在性判断规则,必须把真实的磁盘最终文件路径和构建目标绑定,才能触发make的增量检查机制
正确配置修改方案
直接替换原.pro文件内容如下,核心逻辑是让make的依赖检查直接落到真实的dll文件路径上:
# 基础配置 TARGET = MySuperLibrary.dll DESTDIR = ../../BuildAll # 仅运行自定义脚本,无内置编译流程 TEMPLATE = aux # 生成跨平台兼容的真实目标文件路径,无需手动替换斜杠 FINAL_DLL_PATH = $$clean_path($$PWD/$$DESTDIR/$$TARGET) # 定义真实文件构建目标:target字段直接绑定磁盘上的最终dll路径 long_build_script.target = $$FINAL_DLL_PATH # 替换成你实际需要执行的耗时10分钟的生成脚本命令 long_build_script.commands = 在这里填写你的dll生成脚本路径 # 如果你的dll生成过程有依赖的输入源文件,把所有依赖文件路径列在这里,无依赖则留空 long_build_script.depends = # 把自定义目标加入qmake的构建列表 QMAKE_EXTRA_TARGETS += long_build_script # 关键:将真实dll路径直接加入预构建依赖,不要绑定中间虚目标 PRE_TARGETDEPS += $$FINAL_DLL_PATH
生效逻辑说明
- make执行构建时,会首先检查
FINAL_DLL_PATH对应的文件状态:- 如果文件已存在,且时间戳比所有依赖文件新,直接跳过构建步骤,不会触发耗时10分钟的生成脚本
- 如果文件不存在,或者依赖的源文件比dll更新,才会执行绑定的长脚本
- 去掉手动替换路径分隔符的逻辑,用
$$clean_path()自动处理跨平台路径兼容,避免出现路径识别错误、导致make始终判定dll不存在的问题
避坑提醒
- 禁止将无实体文件的虚目标加入
PRE_TARGETDEPS,这类目标没有对应的磁盘文件,make永远会判定它需要重建,最终导致脚本每次强制执行 aux模板不存在内置编译流程,不要依赖qmake的默认增量检查逻辑,所有增量判断规则都需要通过绑定真实文件路径来手动定义
内容的提问来源于stack exchange,提问作者eatyourgreens
相关产品推荐
相关产品推荐

