在 CMake 中,PRIVATE
、PUBLIC
和 INTERFACE
是控制依赖传递性的关键修饰符。它们决定了目标属性(如头文件路径、编译选项、链接库等)如何传递给依赖它的其他目标。以下是详细的解释和示例:
1. 核心概念
CMake 的每个目标(如库或可执行文件)可以定义以下属性:
- 头文件路径(
include_directories
) - 编译选项(
compile_definitions
、compile_options
) - 链接库(
link_libraries
)
这些属性可以通过 PRIVATE
、PUBLIC
或 INTERFACE
修饰符指定其传递性:
修饰符 | 当前目标是否使用该属性? | 依赖该目标的其他目标是否继承该属性? |
---|---|---|
PRIVATE |
✔️ | ❌ |
INTERFACE |
❌ | ✔️ |
PUBLIC |
✔️ | ✔️ |
2. 具体场景分析
场景 1:头文件路径的传递
假设目标 A
是一个库,B
是可执行文件,且 B
依赖 A
:
# 定义目标 A(库)
add_library(A ...)
# 为 A 添加头文件路径
target_include_d