与CMake的target_include_directories相关的关键字PUBLIC、PRIVATE和INTERFACE的含义是什么?
target_include_directories
PUBLIC
PRIVATE
INTERFACE
hxzsmxv21#
这些关键字用于告诉何时需要传递给目标的包含目录列表。when表示是否需要这些包含目录:
当CMake编译一个目标时,它会使用目标的INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS和COMPILE_OPTIONS属性。当你在target_include_directories()中使用PRIVATE关键字时,你会告诉CMake填充这些目标属性。当CMake检测到目标A和另一个目标B之间的依赖关系时(就像使用target_link_libraries(A B)命令一样),它会将B * 使用要求 * 传递到A目标。这些属性由上面列出的属性的INTERFACE_*版本指定(如INTERFACE_INCLUDE_DIRECTORIES),并在调用target_*()命令时使用INTERFACE关键字填充。关键字PUBLIC大致表示PRIVATE + INTERFACE。因此,假设您正在创建一个使用一些Boost头文件的库A,您将执行以下操作:
INCLUDE_DIRECTORIES
COMPILE_DEFINITIONS
COMPILE_OPTIONS
target_include_directories()
target_link_libraries(A B)
B
A
INTERFACE_*
INTERFACE_INCLUDE_DIRECTORIES
target_*()
PRIVATE + INTERFACE
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
.cpp
.h
target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
CMake 3.0文档包含有关此构建规范和使用要求属性的更多详细信息。
soat7uwm2#
INTERFACE、PUBLIC和PRIVATE关键字是指定下列参数的作用域所必需的。PRIVATE和PUBLIC项将填充的INCLUDE_DIRECTORIES属性< target >。PUBLIC和INTERFACE项将填充的INTERFACE_INCLUDE_DIRECTORIES属性< target >。下列参数指定包含目录。从文档中:http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html用我自己的话重新表述文档:
2条答案
按热度按时间hxzsmxv21#
这些关键字用于告诉何时需要传递给目标的包含目录列表。when表示是否需要这些包含目录:
当CMake编译一个目标时,它会使用目标的
INCLUDE_DIRECTORIES
、COMPILE_DEFINITIONS
和COMPILE_OPTIONS
属性。当你在target_include_directories()
中使用PRIVATE
关键字时,你会告诉CMake填充这些目标属性。当CMake检测到目标A和另一个目标B之间的依赖关系时(就像使用
target_link_libraries(A B)
命令一样),它会将B
* 使用要求 * 传递到A
目标。这些属性由上面列出的属性的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文档包含有关此构建规范和使用要求属性的更多详细信息。
soat7uwm2#
INTERFACE、PUBLIC和PRIVATE关键字是指定下列参数的作用域所必需的。PRIVATE和PUBLIC项将填充的INCLUDE_DIRECTORIES属性< target >。PUBLIC和INTERFACE项将填充的INTERFACE_INCLUDE_DIRECTORIES属性< target >。下列参数指定包含目录。
从文档中:http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
用我自己的话重新表述文档: