You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中如何在多目标间复用预编译头且不引入依赖?

解决CMake多目标复用预编译头且不引入依赖的方法

要在多个目标间复用同一组预编译头同时避免不必要的依赖,推荐用INTERFACE目标来封装预编译头配置,这是CMake官方推荐的无依赖复用方式:

具体步骤

  • 创建一个INTERFACE类型的目标,专门用来定义预编译头列表
  • 让需要复用预编译头的目标链接这个INTERFACE目标

代码示例

# 创建INTERFACE目标,仅传递编译配置,不生成二进制文件
add_library(PrecompiledHeaders INTERFACE)
# 为INTERFACE目标设置预编译头
target_precompile_headers(PrecompiledHeaders INTERFACE
    header1.h
    header2.h
    header3.h
    header4.h
)

# 让目标1复用预编译头
target_link_libraries(target1 PUBLIC PrecompiledHeaders)
# 让目标2复用预编译头,不会引入对target1的依赖
target_link_libraries(target2 PUBLIC PrecompiledHeaders)

为什么这个方法可行

  • INTERFACE目标本身不会生成任何可执行文件或库,只是作为编译设置的载体
  • 当其他目标链接它时,只会继承预编译头的配置,不会将INTERFACE目标或其他关联目标作为依赖项
  • 完全规避了REUSE_FROM带来的跨目标依赖问题,也不需要依赖CMake生成pch文件的内部格式,稳定性更强

对之前尝试方法的说明

  • 使用REUSE_FROM target1会强制让target2依赖target1,这是CMake的设计逻辑,目的是保证预编译头的一致性,但会带来多余的构建触发
  • 用字符串替换生成包含语句的方式依赖CMake生成cmake_pch.hxx的内部实现,后续版本的CMake可能会修改这个文件的生成规则,导致方法失效

内容的提问来源于stack exchange,提问作者Chuu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:55:18