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 内容必须是“稳定、高频、不变”的头文件集合,例如:
target_precompile_headers(my_target PRIVATE
"$<build_interface:>"
)</build_interface:>
-
PRIVATE表示仅该 target 使用,不传递给依赖者;若需导出(如库接口头依赖 PCH),改用PUBLIC - 路径必须可被所有源文件访问,推荐用
$<...> -
-
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











