关键字PUBLIC
、PRIVATE
和INTERFACE
与CMake的target_include_directories
有关是什么意思?
这些关键字用于判断何时需要传递给目标的包含目录列表。通过何时,这意味着是否需要这些包含目录:
- 编译该目标本身。
- 编译依赖于该目标的其他目标(例如使用其公共标头(。
- 在上述两种情况下。
当 CMake 编译目标时,它会使用目标INCLUDE_DIRECTORIES
、COMPILE_DEFINITIONS
和 COMPILE_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 的操作。