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
相关产品推荐
相关产品推荐

