target_include_directories

向目标添加包含目录。

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

指定编译给定目标时使用的包含目录。指定的目标 <target> 必须已经通过诸如 add_executable()add_library() 的命令创建,并且不能是 ALIAS 目标

通过显式使用 AFTERBEFORE,您可以选择追加或前置,这与默认行为无关。

需要 INTERFACEPUBLICPRIVATE 关键字来指定后续参数的 范围PRIVATEPUBLIC 项将填充 <target>INCLUDE_DIRECTORIES 属性。PUBLICINTERFACE 项将填充 <target>INTERFACE_INCLUDE_DIRECTORIES 属性。以下参数指定包含目录。

3.11 版本新增: 允许在 IMPORTED 目标上设置 INTERFACE 项。

对同一 <target> 的重复调用将按调用顺序追加项。

如果指定了 SYSTEM,编译器将得知这些目录在某些平台上是系统包含目录。这可能会产生一些效果,例如抑制警告或在依赖项计算中跳过所包含的头文件(请参阅编译器文档)。此外,系统包含目录在正常包含目录之后进行搜索,无论指定顺序如何。

如果 SYSTEMPUBLICINTERFACE 一起使用,则 INTERFACE_SYSTEM_INCLUDE_DIRECTORIES 目标属性将填充指定的目录。

target_include_directories 的参数可以使用 $<...> 语法的生成器表达式。有关可用表达式,请参阅 cmake-generator-expressions(7) 手册。有关定义构建系统属性的更多信息,请参阅 cmake-buildsystem(7) 手册。

指定的包含目录可以是绝对路径或相对路径。相对路径将被解释为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR),并在存储到相关目标属性之前转换为绝对路径。如果路径以生成器表达式开头,它将始终被假定为绝对路径(除了下面提到的一个例外),并且将不做修改地使用。

包含目录的使用要求通常在构建树和安装树之间有所不同。BUILD_INTERFACEINSTALL_INTERFACE 生成器表达式可用于根据使用位置描述不同的使用要求。INSTALL_INTERFACE 表达式中允许使用相对路径,并将其解释为相对于安装前缀。不应在 BUILD_INTERFACE 表达式中使用相对路径,因为它们不会转换为绝对路径。例如

target_include_directories(mylib PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
  $<INSTALL_INTERFACE:include/mylib>  # <prefix>/include/mylib
)

创建可重定位包

请注意,不建议使用依赖项包含目录的绝对路径来填充目标的 INSTALL_INTERFACEINTERFACE_INCLUDE_DIRECTORIES。这将把依赖项的包含目录路径硬编码到已安装的包中,**这些路径是在生成包的机器上找到的**。

INSTALL_INTERFACEINTERFACE_INCLUDE_DIRECTORIES 仅适用于指定目标本身提供的头文件所需的包含目录,而不适用于其 INTERFACE_LINK_LIBRARIES 目标属性中列出的传递依赖项。这些依赖项本身应该是目标,它们在 INTERFACE_INCLUDE_DIRECTORIES 中指定自己的头文件位置。

有关创建可重新定位包时指定使用要求时必须采取的额外注意事项,请参阅 cmake-packages(7) 手册的 Creating Relocatable Packages 部分。

另请参阅