贝利信息

如何为c++项目配置预编译头文件(PCH)以加快编译速度? (CMake/VS设置)

日期:2026-01-21 00:00 / 作者:裘德小鎮的故事
预编译头文件(PCH)能显著缩短大型C++项目编译时间,但需正确配置:VS中须为每个.cpp手动设/Yu并确保首行#include "pch.h";CMake需按编译器分别处理,MSVC用target_precompile_headers()配合add_compile_options("$"),Clang需确保pch.h在include路径中;GCC不建议使用;PCH头须稳定、禁含宏/模板/条件编译;验证需检查/showIncludes输出及cl.exe参数是否含/Yu和/Fp。

预编译头文件(PCH)在大型 C++ 项目中确实能显著缩短编译时间,但效果高度依赖配置方式——stdafx.hpch.h 本身不加速,错误的包含顺序、不一致的编译选项或未被所有源文件使用,反而会让构建更慢甚至失败。

VS 中启用 PCH 需手动设置每个源文件的“预编译头”属性

Visual Studio 不会自动将 pch.h 应用到所有 .cpp 文件。即使你在项目属性里启用了“创建/使用预编译头”,每个 .cpp 文件仍需单独设置:

CMake 中配置 PCH 必须区分编译器且显式指定头路径

CMake 本身不原生支持 PCH,需通过编译器特定方式注入。对 MSVC 和 Clang/LLVM 处理完全不同:

target_precompile_headers(mylib PRIVATE "pch.h")
target_include_directories(mylib PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
# 注意:pch.h 必须能被 #include "pch.h" 直接找到,否则报 C1083

PCH 头文件内容必须稳定,且禁止含宏/模板/条件编译

一旦 PCH 编译完成,其二进制缓存(如 pch.pchpch.h.gch)就固定了。以下写法会导致隐性失效或编译错误:

验证 PCH

是否真正生效的关键指标

别只看“有没有生成 pch.pch”,要确认它被实际使用:

最常被忽略的一点:PCH 加速效果在增量编译中并不线性。改一个业务头文件,可能只触发 3 个 .cpp 重编;但改 pch.h,会触发全部重编。所以 PCH 头越稳定、越少变更,长期收益越大——把它当成“只读的底层契约”,而不是“方便塞一堆 include 的垃圾桶”。