CMake的作用域:public/private/interface

在 CMake 中,public、private和 interface是用来指定目标属性的作用域的关键字,这三个有什么区别呢?这些关键字用于控制属性的可见性和传递性,影响了目标之间的依赖关系和属性传递。

  1. public

如果在一个目标上使用 public关键字时,该属性会传递给依赖于该目标的其他目标。例如在目标 A 上设置了一个 public属性,然后将目标 A 作为目标 B 的依赖项,那么目标 B 也会继承目标 A 上设置的 public属性,目标B再作为目标C的依赖项的时候目标C对目标A是可见的。

  1. private

如果在一个目标上使用 private关键字时,该属性只会应用于当前目标,不会传递给依赖项。例如在目标 A 上设置了一个 private属性,该属性不会传递给依赖于目标 A 的其他目标。

  1. interface

如果在一个目标上使用 interface 关键字时,该属性会传递给依赖于当前目标的其他目标,但不会应用于当前目标。例如在目标 A 上设置了一个 interface属性,该属性会传递给依赖于目标 A 的其他目标,但不会应用于目标 A 本身。

附上官方文档的一个例子Transitive Usage Requirements来看,这里删除了一些无关的定义宏,CMake的语句清晰一点:

add_library(archive archive.cpp)

add_library(serialization serialization.cpp)

add_library(archiveExtras extras.cpp)
target_link_libraries(archiveExtras PUBLIC archive)
target_link_libraries(archiveExtras PRIVATE serialization)

add_executable(consumer consumer.cpp)

target_link_libraries(consumer archiveExtras)

在这里插入图片描述

  • 因为archive 是archiveExtras的PUBLIC依赖项,所以它的符号在编译的时候也会传播给consumer 。

  • 因为serialization 是archiveExtras的PRIVATE依赖项,所以它的符号在编译的时候不会传播到consumer 。

Generally, a dependency should be specified in a use of target_link_libraries() with the PRIVATE keyword if it is used by only the implementation of a library, and not in the header files. If a dependency is additionally used in the header files of a library (e.g. for class inheritance), then it should be specified as a PUBLIC dependency. A dependency which is not used by the implementation of a library, but only by its headers should be specified as an INTERFACE dependency.

讲了target_link_libraries() 怎么使用public/private/interface关键字:

  • 【private:cpp使用依赖项,hpp不使用依赖项】如果依赖项仅由库的实现使用,而不是在头文件中使用,使用private。
  • 【public:cpp使用依赖项,hpp使用依赖项】如果在库的头文件中额外使用了依赖项(库的视线也使用了依赖项)(例如用于类继承),使用public。
  • 【interface:cpp不使用依赖项,hpp使用依赖项】如果库的实现不使用依赖项,而仅由其库的头文件使用的依赖项应指定为interface。
  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值