target_include_directories

为目标添加包含目录。

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

指定编译给定目标时要使用的包含目录。命名的 <target> 必须是由 add_executable()add_library() 等命令创建的,并且不能是 别名目标

通过显式使用 AFTERBEFORE,可以独立于默认值来选择追加或前置。

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

3.11 版本新增: 允许在 导入目标 上设置 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_INTERFACE 来填充目标的 INTERFACE_INCLUDE_DIRECTORIES 属性,使其指向依赖项的包含目录的绝对路径。这会将依赖项的包含目录路径硬编码到已安装的包中,**就像在构建包的机器上找到的那样**。

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

有关创建可重定位包(relocatable packages)时在指定使用需求时需要注意的额外事项的讨论,请参阅 cmake-packages(7) 手册的 创建可重定位包 部分。

另请参阅