target_include_directories¶
为目标添加包含目录。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定编译给定目标时要使用的包含目录。命名的 <target> 必须是由 add_executable() 或 add_library() 等命令创建的,并且不能是 别名目标。
通过显式使用 AFTER 或 BEFORE,可以独立于默认值来选择追加或前置。
必需使用 INTERFACE、PUBLIC 和 PRIVATE 关键字来指定以下参数的 范围。 PRIVATE 和 PUBLIC 条目将填充 <target> 的 INCLUDE_DIRECTORIES 属性。 PUBLIC 和 INTERFACE 条目将填充 <target> 的 INTERFACE_INCLUDE_DIRECTORIES 属性。以下参数指定包含目录。
3.11 版本新增: 允许在 导入目标 上设置 INTERFACE 项。
对同一 <target> 的重复调用将按照调用顺序追加条目。
如果指定了 SYSTEM,编译器将得知在某些平台上这些目录被视为系统包含目录。这可能会产生抑制警告或在依赖项计算中跳过包含的头文件(请参阅编译器文档)等效果。此外,系统包含目录的搜索顺序在普通包含目录之后,无论其指定顺序如何。
如果 SYSTEM 与 PUBLIC 或 INTERFACE 一起使用,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES 目标属性将被指定的目录填充。
对 target_include_directories 的参数可以使用生成器表达式,语法为 $<...>。有关可用表达式,请参阅 cmake-generator-expressions(7) 手册。有关定义构建系统属性的更多信息,请参阅 cmake-buildsystem(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
)
创建可重定位包¶
请注意,不建议使用 INSTALL_INTERFACE 来填充目标的 INTERFACE_INCLUDE_DIRECTORIES 属性,使其指向依赖项的包含目录的绝对路径。这会将依赖项的包含目录路径硬编码到已安装的包中,**就像在构建包的机器上找到的那样**。
INSTALL_INTERFACE 的 INTERFACE_INCLUDE_DIRECTORIES 仅适用于指定目标本身提供的头文件所需的包含目录,而不适用于其 INTERFACE_LINK_LIBRARIES 目标属性中列出的传递依赖项。这些依赖项本身应该是指定其自身头文件位置的 INTERFACE_INCLUDE_DIRECTORIES 的目标。
有关创建可重定位包(relocatable packages)时在指定使用需求时需要注意的额外事项的讨论,请参阅 cmake-packages(7) 手册的 创建可重定位包 部分。