target_include_directories

将包含目录添加到目标中。

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

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

通过明确使用 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 填充依赖项的 include 目录的绝对路径。这会使已安装包的 include 目录路径硬编码为在创建包的机器上发现的依赖项

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

有关在为重新分发创建包时指定使用要求时必须特别注意的讨论,请参见 cmake-packages(7) 手册的 创建可重定位包 部分。

另请参见