target_include_directories¶
将包含目录添加到目标。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定编译给定目标时要使用的包含目录。命名的 <target> 必须由命令创建,例如 add_executable() 或 add_library() 并且不能是 ALIAS target。
通过显式使用 AFTER 或 BEFORE,您可以独立于默认值在追加和前置之间进行选择。
需要 INTERFACE、PUBLIC 和 PRIVATE 关键字来指定以下参数的范围 <Target Usage Requirements>`。 PRIVATE 和 PUBLIC 项将填充 <target> 的 INCLUDE_DIRECTORIES 属性。 PUBLIC 和 INTERFACE 项将填充 <target> 的 INTERFACE_INCLUDE_DIRECTORIES 属性。以下参数指定包含目录。
在 3.11 版本加入: 允许在 IMPORTED 目标 <Imported Targets> 上设置 ``INTERFACE` 项目。
重复调用相同的 <target> 按调用的顺序追加项目。
如果指定了“SYSTEM”,编译器将被告知这些目录在某些平台上是系统包含目录。这可能会产生诸如抑制警告或跳过依赖项计算中包含的标头等效果(请参阅编译器文档)。此外,无论指定的顺序如何,都会在正常包含目录之后搜索系统包含目录。
如果``SYSTEM`` 与``PUBLIC`` 或``INTERFACE`` 一起使用, INTERFACE_SYSTEM_INCLUDE_DIRECTORIES 目标属性将填充指定的目录。
target_include_directories 的参数可以使用语法为“$<...>”的生成器表达式。请参阅 cmake-generator-expressions(7) 手册了解可用的表达式。 |更多_另见|
指定的包含目录可以是绝对路径也可以是相对路径。相对路径将被解释为相对于当前源目录(即 CMAKE_CURRENT_SOURCE_DIR)并在将其存储在关联的目标属性之前转换为绝对路径。如果路径以生成器表达式开头,它将始终被假定为绝对路径(下面提到的一个例外)并且将不加修改地使用。
包含目录的使用要求通常在构建树和安装树之间有所不同。 BUILD_INTERFACE 和 INSTALL_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
)
创建可重定位包¶
请注意,不建议填充 INTERFACE_INCLUDE_DIRECTORIES 的 :genex:`INSTALL_INTERFACE`具有到依赖项包含目录的绝对路径的目标。这会将硬编码到已安装的包中,包括依赖项的目录路径**在创建包的机器上**。
INTERFACE_INCLUDE_DIRECTORIES 的 INSTALL_INTERFACE`仅适用于为目标本身提供的标头指定所需的包含目录,而不适用于其 :prop_tgt:`INTERFACE_LINK_LIBRARIES 目标属性中列出的传递依赖项提供的目录。这些依赖项本身应该是在 INTERFACE_INCLUDE_DIRECTORIES 中指定自己的标头位置的目标。
请参阅 cmake-packages(7) 手册的 创建可重定位包 部分,讨论在创建用于重新分发的包时指定使用要求时必须注意的额外注意事项。