CMake target_include_directories scope的含义 [英] CMake target_include_directories meaning of scope
问题描述
关键字 PUBLIC
, PRIVATE
和 INTERFACE
相关于CMake的
target_include_directories
?
用于告知何时需要传递到目标的包含目录的列表。 时,表示是否需要这些目录:
- >
- 编译依赖该目标的其他目标(例如使用其公开头文件)。
- 在上述两种情况下。
当CMake编译目标时,它使用目标 INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
和 COMPILE_OPTIONS
属性。当您在 target_include_directories()
等中使用 PRIVATE
关键字时,您告诉CMake填充这些目标属性。 p>
当CMake检测到目标A和另一个目标B之间的依赖关系时(比如当你使用 target_link_libraries(AB)
),它向 A
目标传递 B
使用要求。那些依赖于 B
的目标必须满足的目标使用要求是include目录,编译定义等。它们由上面列出的属性(例如 INTERFACE_INCLUDE_DIRECTORIES
)的 INTERFACE _ *
版本指定, INTERFACE
关键字 $
PUBLIC
关键字表示大致 PRIVATE + INTERFACE
。
因此,假设您正在创建一个使用一些Boost头的库 A
。您将:
-
target_include_directories(A PRIVATE $ {Boost_INCLUDE_DIRS})
只能在源文件(.cpp
)或私有头文件(.h
)中使用那些Boost头。 li>
-
target_include_directories(A INTERFACE $ {Boost_INCLUDE_DIRS})
如果您不在源文件中使用这些Boost头编译A
)。我实际上不能想到一个现实世界的例子。 -
target_include_directories(PUBLIC $ {Boost_INCLUDE_DIRS})
在您的公共头文件中使用那些Boost头,这些头文件包含在A
的源文件中的一部分,也可能包含在您的A
库。
CMake 3.0文档中有更多详细信息构建规范和使用要求属性。
What is the meaning of the keyword PUBLIC
, PRIVATE
, and INTERFACE
related to CMake's target_include_directories
?
These keywords are used to tell when the list of include directories you're passing to the target are needed. By when, it means if those include directories are needed:
- To compile that target itself.
- To compile other targets that depend on that target (like using its public headers).
- In both of the above situations.
When CMake is compiling a target, it uses the targets INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
, and COMPILE_OPTIONS
properties. When you use the PRIVATE
keyword in target_include_directories()
and alike, you tell CMake to populate those target properties.
When CMake detects a dependency between a target A and another target B (like when you use the target_link_libraries(A B)
command), it transitively propagates B
usage requirements to the A
target. Those target usage requirements are the include directories, compile definitions, etc. that any target that depends on B
must meet. They are specified by the INTERFACE_*
version of the properties listed above (like INTERFACE_INCLUDE_DIRECTORIES
), and are populated by using the INTERFACE
keyword when calling the target_*()
commands.
The PUBLIC
keyword means roughly PRIVATE + INTERFACE
.
Therefore, suppose you are creating a library A
that uses some Boost headers. You would do:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
if you only use those Boost headers inside your source files (.cpp
) or private header files (.h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
if you don't use those Boost headers inside your source files (therefore, not needing them to compileA
). I can't actually think of a real-world example for this.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
if you use those Boost headers in your public header files, which are included BOTH in some ofA
's source files and might also be included in any other client of yourA
library.
CMake 3.0 documentation has more details on this build specification and usage requirements properties.
这篇关于CMake target_include_directories scope的含义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!