CMake add_custom_command每次都生成头文件 如何配置正确依赖关系
问题根因
当前配置每次构建都强制执行头文件生成,核心是两个配置错误:
add_custom_command声明的输出文件使用了相对路径,和mkheaders实际生成的文件路径不匹配。CMake依赖输出文件的时间戳判断是否需要重跑命令,如果找不到声明的输出文件,会默认输出不存在,每次构建都重新执行生成逻辑。- 自定义目标
generate_headers仅依赖了header1.h,没有把第二个生成头文件纳入依赖链,同时调用mkheaders使用了../开头的相对路径,构建时工作目录变动会导致路径解析异常,进一步破坏增量判断逻辑。
修正方案
调整配置时统一使用绝对路径声明输入、输出和执行脚本,把所有生成文件纳入依赖链,参考如下配置:
# 预定义路径变量,避免相对路径歧义 set(INPUT_C_FILE ${CMAKE_CURRENT_SOURCE_DIR}/thecfile.c) # 推荐将生成文件放在构建目录下,避免污染源码目录;如果需要放源码目录可替换为CMAKE_CURRENT_SOURCE_DIR对应路径 set(GENERATED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated_headers) file(MAKE_DIRECTORY ${GENERATED_INCLUDE_DIR}) set(OUT_HEADER1 ${GENERATED_INCLUDE_DIR}/header1.h) set(OUT_HEADER2 ${GENERATED_INCLUDE_DIR}/header2.h) add_custom_command( OUTPUT ${OUT_HEADER1} ${OUT_HEADER2} COMMENT "Generating headers from thecfile.c" DEPENDS ${INPUT_C_FILE} # 请根据mkheaders的实际路径调整,若mkheaders是本项目编译的可执行目标,直接写COMMAND mkheaders 并在DEPENDS中追加mkheaders即可 COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../mkheaders ${INPUT_C_FILE} ${OUT_HEADER1} ${OUT_HEADER2} # 显式指定工作目录,避免路径解析混乱 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} VERBATIM ) # 自定义目标依赖所有生成的头文件 add_custom_target(generate_headers DEPENDS ${OUT_HEADER1} ${OUT_HEADER2}) # 给业务目标添加依赖和头文件搜索路径 add_dependencies(rackmaster generate_headers) target_include_directories(rackmaster PRIVATE ${GENERATED_INCLUDE_DIR}) # 引用两个头文件的其他C文件所属目标,也需要添加相同的依赖和包含路径配置
配置说明
- 如果
mkheaders是项目内通过add_executable定义的构建产物,不需要写脚本的相对路径,直接在COMMAND后写目标名mkheaders,同时在add_custom_command的DEPENDS列表中追加mkheaders即可。CMake会自动定位可执行文件位置,还会自动处理依赖:当mkheaders本身被修改重编译后,也会自动触发头文件重新生成。 - 配置完成后第一次构建会正常生成头文件,后续只要
thecfile.c、mkheaders没有变更,就不会重复执行头文件生成逻辑,实现预期的增量构建。
内容的提问来源于stack exchange,提问作者user242579
相关产品推荐
相关产品推荐

