CMake 中的 `PUBLIC`、`INTERFACE` 和 `PRIVATE`

理解 PUBLICINTERFACEPRIVATE 是掌握现代 CMake 的关键,特别是用 target_link_librariestarget_include_directories 时。它们定义了目标(library或executable)与它依赖项之间的依赖和传播规则


1. 概念解释

假设你有两个目标:

  • A:你的库或程序
  • B:A 依赖的另一个库

当你说:

target_link_libraries(A <visibility> B)

其中 <visibility> 可以是:

  • PRIVATE
  • PUBLIC
  • INTERFACE

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值