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

CMake+Ninja外部目录生成头文件后未触发重编译问题问询

CMake项目中Windows下生成头文件后源文件未触发重编译的问题

问题描述

在CMake项目中复现了一个问题:重新生成头文件后,引用该头文件的源文件未触发重编译。目前通过复制文件到二进制目录规避,寻求无需复制的解决方法。

项目文件

CMakeLists.txt

cmake_minimum_required(VERSION 4.0)
project(foo)

set(GENERATED_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../drv/foo.h)

add_custom_command(OUTPUT ${GENERATED_FILE}
                   COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.bat
                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/generate.bat
                   COMMENT "Generating foo.h"
                   VERBATIM
)
add_custom_target(generate_foo DEPENDS ${GENERATED_FILE})

add_executable(main impl.cxx)
add_dependencies(main generate_foo)
target_include_directories(main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../drv)

generate.bat

mkdir D:\Scratch\tmp\drv
echo const int X = 10; > D:\Scratch\tmp\drv\foo.h

impl.cxx

#include <foo.h>

int main() {
  return 0;
}

问题现象

  • 执行构建流程后,触发头文件重新生成,但源文件未被编译;再次执行构建命令才会触发重编译。
  • Ninja依赖文件中以相对路径列出该头文件。
  • 若将头文件放在CMAKE_CURRENT_BINARY_DIR内,Ninja可正确检测更新。

环境信息

  • CMake版本:4.0.3
  • Ninja版本:1.14.0.git

更新信息

  • 将相关路径改为绝对路径后问题仍存在。
  • 该问题仅在Windows出现,Linux下无此问题。
  • 解析编译器输出生成依赖的模块会将路径转为相对路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:49:59