target_precompile_headers

在 3.16 版本加入.

添加要预编译的头文件列表。

预编译头文件可以通过创建一些头文件的部分处理版本,然后在编译期间使用该版本而不是重复解析原始头文件来加快编译速度。

主窗体

target_precompile_headers(<target>
  <INTERFACE|PUBLIC|PRIVATE> [header1...]
  [<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])

该命令将头文件添加到 <target>`PRECOMPILE_HEADERS 和/或 INTERFACE_PRECOMPILE_HEADERS 目标属性。命名的 <target> 必须由命令创建,例如 add_executable()add_library() 并且不能是 ALIAS target

需要 INTERFACEPUBLICPRIVATE 关键字来指定以下参数的范围 <Target Usage Requirements>`。 PRIVATEPUBLIC 项将填充 <target>PRECOMPILE_HEADERS 属性。 PUBLICINTERFACE 项将填充 <target>INTERFACE_PRECOMPILE_HEADERS 属性( IMPORTED 目标 仅支持 INTERFACE 项).重复调用相同的 <target> 将按照调用的顺序追加项目。

项目通常应避免使用 PUBLICINTERFACE 用于要导出的目标 <install(EXPORT)>`,或者它们至少应使用 $<BUILD_INTERFACE:。 ..> 生成器表达式,以防止预编译标头出现在已安装的导出目标中。目标的消费者通常应该控制他们使用的预编译头,而不是被消费的目标强加给他们的预编译头(因为预编译头通常不是使用要求)。一个值得注意的例外是:ref:接口库 <Interface Libraries> 被创建以在一个地方定义一组常用的预编译标头,然后其他目标私下链接到该接口库。在这种情况下,接口库的存在专门用于将预编译标头传播给它的消费者,并且消费者实际上仍然处于控制之中,因为它决定是否链接到接口库。

头文件列表用于生成名为``cmake_pch.h|xx``的头文件,该头文件用于生成预编译头文件(.pch.gch.pchi ``) 神器。 ``cmake_pch.h|xx 头文件将被强制包含(对于 GCC 为``-include``,对于 MSVC 为``/FI``)到所有源文件中,因此源不需要``#包括“pch.h”``

用尖括号(例如 <unordered_map>)或显式双引号(为 cmake-language(7) 转义,例如 [["other_header.h"]]` 指定的头文件名`) 将按原样处理,并且包含目录必须可供编译器找到它们。其他头文件名(例如 ``project_header.h)被解释为相对于当前源目录(例如 CMAKE_CURRENT_SOURCE_DIR)并将包含在绝对路径中。例如:

target_precompile_headers(myTarget
  PUBLIC
    project_header.h
  PRIVATE
    [["other_header.h"]]
    <unordered_map>
)

有关定义构建系统属性的更多信息。

target_compile_features 的参数可以使用语法为“$<...>”的生成器表达式。请参阅 cmake-generator-expressions(7) 手册了解可用的表达式。 |更多_另见|

target_precompile_headers(mylib PRIVATE
  "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/cxx_only.h>"
  "$<$<COMPILE_LANGUAGE:C>:<stddef.h$<ANGLE-R>>"
  "$<$<COMPILE_LANGUAGE:CXX>:<cstddef$<ANGLE-R>>"
)

重用预编译标头

该命令还支持第二个签名,可用于指定一个目标重新使用来自另一个目标的预编译头文件工件,而不是生成自己的:

target_precompile_headers(<target> REUSE_FROM <other_target>)

这种形式将 PRECOMPILE_HEADERS_REUSE_FROM 属性设置为 <other_target> 并添加一个依赖项,使得 <target> 将依赖于 <other_target>。如果在使用 REUSE_FROM 形式时已经设置了 <target>PRECOMPILE_HEADERS 属性,CMake 将因错误而停止。

备注

REUSE_FROM 形式需要为 <target><other_target> 设置相同的编译器选项、编译器标志和编译器定义。如果无法使用预编译头文件 (-Winvalid-pch),某些编译器(例如 GCC)可能会发出警告。

也可以看看