CMake默认不自动启用PCH,因其仅提供target_precompile_headers()等底层机制,不内置PCH语义抽象;是否生效取决于编译器支持(GCC/Clang≥11、MSVC≥VS2017)、项目配置对齐及源文件显式包含预编译头。

为什么 CMake 默认不自动启用 PCH?
CMake 本身不内置 PCH 的语义抽象,它只提供底层机制(如 target_precompile_headers),是否生效取决于编译器支持与项目配置是否对齐。GCC/Clang 从 11+、MSVC 从 VS2017 起才稳定支持标准 PCH 模式,旧版本或混合工具链下容易静默失效。
常见错误现象:target_precompile_headers 调用无报错但构建时间未下降,甚至变慢——大概率是头文件未被实际包含、或编译器未真正生成/复用 PCH 文件。
- 必须确保目标源文件中 **显式包含** 预编译头(如
#include "pch.h"),且它是第一个非注释/非空行的#include - MSVC 要求
/Yc(生成)和/Yu(使用)配对;GCC/Clang 则依赖-x c++-header和-include行为 - CMake 3.16+ 才支持
target_precompile_headers;低于此版本需手写add_compile_options+ 条件判断,极易出错
怎么用 target_precompile_headers 正确启用 PCH?
这是现代 CMake(≥3.16)唯一推荐方式,它会自动处理编译器差异、依赖关系和增量构建逻辑。
关键点在于:PCH 内容必须是“稳定、高频、不变”的头文件集合,例如:
立即学习“C++免费学习笔记(深入)”;
target_precompile_headers(my_target PRIVATE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/pch.h>"
)-
PRIVATE表示仅该 target 使用,不传递给依赖者;若需导出(如库接口头依赖 PCH),改用PUBLIC - 路径必须可被所有源文件访问,推荐用
$<...></...> -
<vector></vector><string></string> -


















