CMake 如何自动检测 header 依赖项

How CMake automatically detects header dependencies

我想知道 CMake 是如何自动检测到 main.cpp 依赖于 header.h

// header.h
int f() {
  return 0;
}
// main.cpp
#include "header.h"

int main() {
  return f();
}
# CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(Cppref)

add_executable(main main.cpp)

当我 运行 cmake . -B build 它在 ./build/CMakeFiles/main.dir/build.make

中创建以下 make 目标
CMakeFiles/main.dir/main.cpp.o: CMakeFiles/main.dir/compiler_depend.ts
    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/nikolay/Cpp/Train/Cppref/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/main.dir/main.cpp.o"
    /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/main.dir/main.cpp.o -MF CMakeFiles/main.dir/main.cpp.o.d -o CMakeFiles/main.dir/main.cpp.o -c /home/nikolay/Cpp/Train/Cppref/main.cpp

注意-MD编译器选项,因为 它是 used to dump dependencies visible to the preprocessor.

因此,在第一次构建后,它将创建 ./build/CMakeFiles/main.dir/main.cpp.o.d,内容如下

CMakeFiles/main.dir/main.cpp.o: /home/nikolay/Cpp/Train/Cppref/main.cpp \
  /home/nikolay/Cpp/Train/Cppref/header.h

因此,每当您更改 header.h 时,都会重建目标 main.o