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
相关产品推荐
相关产品推荐

