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

CMake add_custom_command总是执行问题排查求助

问题根源与解决方案

你的问题出在生成文件的路径选择上:你把生成的generated.h放到了源目录(CMAKE_CURRENT_SOURCE_DIR)中,而CMake默认不会追踪源目录内文件的修改时间——它只负责管理构建目录(CMAKE_CURRENT_BINARY_DIR)下的产物。因为CMake无法确认源目录里的生成文件是否已经是最新状态,所以每次构建都会强制重新执行自定义命令。

修复步骤

  1. 将生成文件移至构建目录
    把生成文件的路径改为构建目录下的位置,这样CMake可以直接追踪它的时间戳,对比输入文件的修改时间来决定是否重新生成。

  2. 调整CMake代码
    修改后的自定义命令和目标示例:

    # 提前创建构建目录下的auto子目录,避免生成命令因目录不存在失败
    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/auto)
    
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/auto/generated.h
        COMMAND bash -c "${CMAKE_CURRENT_SOURCE_DIR}/generate_code --output ${CMAKE_CURRENT_BINARY_DIR}/auto/generated.h ${CMAKE_CURRENT_SOURCE_DIR}/input_file.c"
        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/input_file.c
    )
    
    add_custom_target(generate_target
        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/auto/generated.h
    )
    
  3. 让主目标找到生成的头文件
    记得把构建目录下的auto目录加入主目标的包含路径,否则编译时会找不到generated.h:

    target_include_directories(your_main_target PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/auto)
    

额外说明

CMake的设计原则是分离源文件目录和构建产物目录,源目录应保持只读(不被构建过程修改),这样不仅能让CMake准确管理文件依赖关系,还能方便清理构建产物(直接删除整个构建目录即可),同时避免污染版本控制中的源文件。

内容的提问来源于stack exchange,提问作者shaharhoch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:33:14