target_include_directories¶
将包含目录添加到目标中。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定编译给定目标时要使用的包含目录。指定 <target>
之前必须通过诸如 add_executable()
或 add_library()
等命令创建 <target>
,且不能是 别名目标。
通过明确使用 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
填充依赖项的 include 目录的绝对路径。这会使已安装包的 include 目录路径硬编码为在创建包的机器上发现的依赖项。
INSTALL_INTERFACE
中的 INTERFACE_INCLUDE_DIRECTORIES
仅适用于指定目标本身提供的头文件的所需 include 目录,而不适用于其 INTERFACE_LINK_LIBRARIES
目标属性中列出的传递依赖项提供的头文件。这些依赖项本身应该是指定自己的 INTERFACE_INCLUDE_DIRECTORIES
标头位置的目标。
有关在为重新分发创建包时指定使用要求时必须特别注意的讨论,请参见 cmake-packages(7)
手册的 创建可重定位包 部分。