与 CMake 的 target_include_directories相关的关键字 PUBLIC、 PRIVATE和 INTERFACE的含义是什么?
target_include_directories
PUBLIC
PRIVATE
INTERFACE
则需要使用 INTERFACE、 PUBLIC 和 PRIVATE 关键字来指定 下列参数的作用域 填充 < target > . PUBLIC 和 接口项将填充 INTERFACE _ INCLUDE _ DIRECTORIES 属性 < target > 目录。
来自文档: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
用我自己的话重新措辞文件:
这些关键字用于告诉 什么时候需要传递给目标的包含目录列表。什么时候的意思是,如果需要包含目录:
当 CMake 编译目标时,它使用目标 INCLUDE_DIRECTORIES、 COMPILE_DEFINITIONS和 COMPILE_OPTIONS属性。当在 target_include_directories()中使用 PRIVATE关键字或类似的关键字时,告诉 CMake 填充这些目标属性。
INCLUDE_DIRECTORIES
COMPILE_DEFINITIONS
COMPILE_OPTIONS
target_include_directories()
当 CMake 检测到目标 A 和另一个目标 B 之间的依赖关系时(就像使用 target_link_libraries(A B)命令时一样) ,它会将 B 使用要求传播到 A目标。这些 目标使用要求是依赖于 B的任何目标都必须满足的包含目录、编译定义等。它们由上面列出的属性(如 INTERFACE_INCLUDE_DIRECTORIES)的 INTERFACE_*版本指定,并在调用 target_*()命令时使用 INTERFACE关键字填充。
target_link_libraries(A B)
B
A
INTERFACE_INCLUDE_DIRECTORIES
INTERFACE_*
target_*()
PUBLIC关键字的大致意思是 PRIVATE + INTERFACE。
PRIVATE + INTERFACE
因此,假设您正在创建一个使用某些 Boost 头文件的库 A:
.cpp
.h
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
CMake 3.0文档中有关于这个 建立规范和使用要求属性的更多详细信息。