INTERFACE_INCLUDE_DIRECTORIES¶
库的公共包含目录需求列表。
目标可以填充此属性,以发布编译目标头文件所需的包含目录。target_include_directories() 命令会使用 PUBLIC 和 INTERFACE 关键字提供的值来填充此属性。项目也可以直接获取和设置此属性。
当使用 target_link_libraries() 指定目标依赖项时,CMake 将会从所有目标依赖项读取此属性,以确定使用者(consumer)的构建属性。
INTERFACE_INCLUDE_DIRECTORIES 的内容可以使用语法为 $<...> 的“生成器表达式”。有关可用表达式,请参阅 cmake-generator-expressions(7) 手册。有关定义构建系统属性的更多信息,请参阅 cmake-buildsystem(7) 手册。
构建树(build-tree)和安装树(install-tree)之间的包含目录使用需求通常是不同的。BUILD_INTERFACE 和 INSTALL_INTERFACE 生成器表达式可用于描述基于使用位置的独立使用需求。INSTALL_INTERFACE 表达式内允许使用相对路径,并且这些路径会相对于安装前缀进行解释。例如:
target_include_directories(mylib INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
$<INSTALL_INTERFACE:include/mylib> # <prefix>/include/mylib
)
创建可重定位包¶
请注意,不建议使用 INTERFACE_INCLUDE_DIRECTORIES 的 INSTALL_INTERFACE 来指定依赖项的包含目录的绝对路径。这会将包在构建时找到的依赖项包含目录路径硬编码到已安装的包中,就像在构建包的机器上找到的那样。
INTERFACE_INCLUDE_DIRECTORIES 的 INSTALL_INTERFACE 仅适用于指定目标自身提供的头文件所需的包含目录,而不是其 INTERFACE_LINK_LIBRARIES 目标属性中列出的传递依赖项(transitive dependencies)所提供的头文件。这些依赖项本身应是能够在其 INTERFACE_INCLUDE_DIRECTORIES 中指定其自身头文件位置的目标。
有关创建可重定位包(relocatable packages)时在指定使用需求时需要注意的额外事项的讨论,请参阅 cmake-packages(7) 手册的 创建可重定位包 部分。