与CMake PUBLIC
相关的关键字PRIVATE
,INTERFACE
和target_include_directories
的含义是什么?
答案 0 :(得分:68)
这些关键字用于告知何时您需要传递给目标的包含目录列表。通过时,这意味着是否需要包含这些目录:
当CMake正在编译目标时,它会使用目标INCLUDE_DIRECTORIES
,COMPILE_DEFINITIONS
和COMPILE_OPTIONS
属性。当您在PRIVATE
中使用target_include_directories()
关键字时,您可以告诉CMake填充这些目标属性。
当CMake检测到目标A与另一个目标B之间存在依赖关系时(如使用target_link_libraries(A B)
命令时),它会将B
使用要求传递给{ {1}}目标。那些目标使用要求是包含目录,编译定义等,依赖于A
的任何目标必须满足。它们由上面列出的B
版本的属性指定(如INTERFACE_*
),并在调用INTERFACE_INCLUDE_DIRECTORIES
命令时使用INTERFACE
关键字填充。
target_*()
关键字大致意为PUBLIC
。
因此,假设您正在创建一个使用某些Boost标头的库PRIVATE + INTERFACE
。你会这样做:
A
如果您只在源文件(target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
)或私有标头文件(.cpp
)中使用这些Boost标头。.h
如果您不在源文件中使用这些Boost标头(因此,不需要它们来编译target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
)。我实际上无法想到一个真实的例子。A
如果您在公共标头文件中使用这些Boost标头,这些标头包含在某些target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
的源文件中,并且可能也包含在您的任何其他客户端中A
图书馆。CMake 3.0文档提供了有关此build specification and usage requirements属性的更多详细信息。
答案 1 :(得分:10)
INTERFACE,PUBLIC和PRIVATE关键字需要指定 以下参数的范围。 PRIVATE和PUBLIC项目将 填充<的INCLUDE_DIRECTORIES属性目标>。公共和 INTERFACE项目将填充INTERFACE_INCLUDE_DIRECTORIES <财产目标>。以下参数指定include 目录。
来自文档:http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
用我自己的话来改写文档: