CMake target_include_directories范围的含义



关键字PUBLICPRIVATEINTERFACE与CMake的target_include_directories有关是什么意思?

这些关键字用于判断何时需要传递给目标的包含目录列表。通过何时,这意味着是否需要这些包含目录:

  • 编译该目标本身。
  • 编译依赖于该目标的其他目标(例如使用其公共标头(。
  • 在上述两种情况下。

当 CMake 编译目标时,它会使用目标INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS 属性。在 target_include_directories() 和类似中使用 PRIVATE 关键字时,会告诉 CMake 填充这些目标属性。

当 CMake 检测到目标 A 与另一个目标 B 之间存在依赖关系时(如使用 target_link_libraries(A B) 命令时(,它会将B使用要求传递到A目标。这些目标使用要求是依赖于B的任何目标都必须满足的包含目录、编译定义等。它们由上面列出的属性的INTERFACE_*版本(如 INTERFACE_INCLUDE_DIRECTORIES(指定,并在调用 target_*() 命令时使用 INTERFACE 关键字进行填充。

PUBLIC关键字大致表示PRIVATE + INTERFACE

因此,假设您正在创建一个使用某些 Boost 标头的库A。你会做:

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS}),如果您只在源文件 ( .cpp ( 或私有头文件 ( .h ( 中使用这些 Boost 标头。
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS}),如果你不在源文件中使用这些 Boost 标头(因此,不需要它们来编译A(。我实际上想不出一个真实世界的例子。
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS}),如果你在公共头文件中使用这些 Boost 头文件,这些头文件既包含在 A 的某些源文件中,也可能包含在A库的任何其他客户端中。

CMake 3.0 文档提供了有关此生成规范和使用要求属性的更多详细信息。

需要接口、公共和私有关键字来指定 以下参数的范围。私人和公共项目将 填充目标><INCLUDE_DIRECTORIES属性。公共和><目标>的属性。以下参数指定包括 目录。

从文档中: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html

用我自己的话改写文档:

  • 要将目录添加到目标的包含目录列表中
  • 使用 PRIVATE,该目录将添加到目标的包含目录中
  • 使用 INTERFACE,目标不会被修改,但INTERFACE_INCLUDE_DIRECTORIES由目录扩展。该变量是库的公共包含目录列表。
  • 使用 PUBLIC 时,将执行来自 PRIVATE 和 INTERFACE 的操作。

最新更新