当前位置: 首页 > news >正文

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。
http://www.lryc.cn/news/360220.html

相关文章:

  • 设计模式基础知识点(七大原则、UML类图)
  • Android开机动画的结束过程BootAnimation(基于Android10.0.0-r41)
  • 微软远程连接工具:Microsoft Remote Desktop for Mac 中文版
  • 【安规介绍】
  • [sylar]后端学习:配置环境(一)
  • XDMA原理及其应用和发展
  • 携程梁建章:持续投资创新与AI,开启旅游行业未来增长
  • 【网络安全的神秘世界】在win11搭建pikachu靶场
  • 基于Java的零食管理系统的设计与实现(论文+源码)_kaic
  • 【案例实操】银河麒麟桌面操作系统实例分享,V10SP1重启后网卡错乱解决方法
  • 初级前端开发岗
  • 颠仆流离学二叉树2 (Java篇)
  • 柏林自由大学研究团队《Ecology Letters 》揭示AMF在植物对全球变化响应的作用
  • libevent源码跨平台编译(windows/macos/linux)
  • idea+tomcat+mysql 从零开始部署Javaweb项目(保姆级别)
  • LeetCode 每日一题 2024/5/27-2024/6/2
  • BOOST_SREATCH
  • MySQL学习——获取数据库和表格的信息
  • Go语言redis框架 — go-redis
  • C++ | Leetcode C++题解之第125题验证回文串
  • Spring创建对象的多种方式
  • 宝塔部署前后端分离项目手册
  • Leetcode 第 397 场周赛题解
  • Python+Selenium自动化测试项目实战
  • WPS部分快捷操作汇总
  • Kubernetes (K8s) 普及指南
  • Oracle RAC 集群配置共享目录ACFS
  • Google Cloudbuild yaml file 中 entrypoint 和 args 的写法
  • 鸿蒙开发接口图形图像:【@ohos.window (窗口)】
  • LLM 基准测试的深入指南