You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake add_custom_command每次都生成头文件 如何配置正确依赖关系

问题根因

当前配置每次构建都强制执行头文件生成,核心是两个配置错误:

  1. add_custom_command 声明的输出文件使用了相对路径,和mkheaders实际生成的文件路径不匹配。CMake依赖输出文件的时间戳判断是否需要重跑命令,如果找不到声明的输出文件,会默认输出不存在,每次构建都重新执行生成逻辑。
  2. 自定义目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:21:39