target_include_directories¶
向目标添加包含目录。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定用于编译给定目标的包含目录。命名的 <target>
必须通过诸如 add_executable()
或 add_library()
之类的命令创建,并且不得为 ALIAS 目标。
通过显式使用 AFTER
或 BEFORE
,您可以在追加和预置之间进行选择,而与默认设置无关。
INTERFACE
、PUBLIC
和 PRIVATE
关键字是指定以下参数的 作用域 所必需的。PRIVATE
和 PUBLIC
项将填充 INCLUDE_DIRECTORIES
的 <target>
属性。PUBLIC
和 INTERFACE
项将填充 INTERFACE_INCLUDE_DIRECTORIES
的 <target>
属性。以下参数指定包含目录。
3.11 版本新增: 允许在 IMPORTED 目标 上设置 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
中指定了自己的标头位置。
有关在为重新分发创建软件包时指定使用要求时必须格外注意的讨论,请参阅 cmake-packages(7)
手册的 创建可重定位的软件包 部分。