理解 PUBLIC、INTERFACE 和 PRIVATE 是掌握现代 CMake 的关键,特别是用 target_link_libraries 和 target_include_directories 时。它们定义了目标(library或executable)与它依赖项之间的依赖和传播规则。
1. 概念解释
假设你有两个目标:
- A:你的库或程序
- B:A 依赖的另一个库
当你说:
target_link_libraries(A <visibility> B)
其中 <visibility> 可以是:
PRIVATEPUBLICINTERFACE
2. 这三个关键词的区别
| 关键词 | 含义 | 依赖关系对谁生效? |
|---|---|---|
| PRIVATE | 仅对当前目标 A 生效 | 只有 A 自己链接或包含 B;使用 A 的其它目标不会继承 B |
| PUBLIC | 对当前目标 A 和所有使用 A 的目标都生效 | A 自己和依赖 A 的目标都会链接和包含 B |
| INTERFACE | 仅对依赖当前目标 A 的其它目标生效 | 只有依赖 A 的目标会链接或包含 B,A 自己不需要 B |
3. 适用场景举例
-
PRIVATE
A 内部用到 B,但 B 的接口不需要暴露给依赖 A 的其它目标。
例如:
target_link_libraries(A PRIVATE B)A 自己编译链接 B,但 A 的使用者不关心 B。
-
PUBLIC
A 依赖 B,同时 B 是 A 接口的一部分,依赖 A 的其它目标也需要 B。
例如:
target_link_libraries(A PUBLIC B)A 和依赖 A 的所有目标都要链接 B。
-
INTERFACE
A 本身不需要 B,但 A 作为接口库,需要向依赖它的目标传递 B。
例如:
target_link_libraries(A INTERFACE B)A 不编译时链接 B,但依赖 A 的目标会链接 B。
4. 结合 target_include_directories 也是一样道理
target_include_directories(A
PUBLIC include
)
- A 自己编译时用
include - 依赖 A 的目标也用
include
5. 简单总结
| 关键词 | 当前目标使用 B | 依赖当前目标的其它目标使用 B |
|---|---|---|
| PRIVATE | 是 | 否 |
| PUBLIC | 是 | 是 |
| INTERFACE | 否 | 是 |
6. 你这段代码中举例
target_link_libraries(core_bin PUBLIC core_usage)
core_bin自己依赖core_usage- 依赖
core_bin的目标也继承这个依赖(传递性)
target_link_libraries(core INTERFACE core_bin)
core本身不链接core_bin- 但是依赖
core的目标会链接core_bin
728

被折叠的 条评论
为什么被折叠?



