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

CMake中的PUBLIC、PRIVATE 和 INTERFACE用法

在CMake中,PUBLICPRIVATEINTERFACE 是用于指定目标属性(如编译选项、链接库、包含路径等)的访问范围的关键字。它们主要用于target_link_librariestarget_include_directoriestarget_compile_definitions等命令中,影响到哪些目标可以继承这些属性。

1. PRIVATE

  • 目标的属性只对该目标本身可见。
  • 不会传播给依赖该目标的其他目标。

2. PUBLIC

  • 目标的属性不仅对该目标可见,也会传播给依赖该目标的其他目标。

3. INTERFACE

  • 目标的属性不会作用在该目标本身,只会传播给依赖该目标的其他目标。

举例说明

假设你有以下三个库:ABC,其中B依赖于A,而C依赖于B

例子代码结构:
add_library(A STATIC a.cpp)
add_library(B STATIC b.cpp)
add_library(C STATIC c.cpp)target_include_directories(A PUBLIC include/A)
target_include_directories(B PRIVATE include/B)
target_include_directories(C INTERFACE include/C)target_link_libraries(B PUBLIC A)
target_link_libraries(C INTERFACE B)
具体说明:
  1. target_include_directories(A PUBLIC include/A):

    • 由于include/APUBLIC,任何依赖A的目标(比如B)也能访问到include/A路径。因此,编译B时会使用include/A作为包含路径。
  2. target_include_directories(B PRIVATE include/B):

    • 由于include/BPRIVATE,这个路径仅在编译B时使用,而不会传播到依赖B的目标C。所以,编译C时,不会使用include/B作为包含路径。
  3. target_include_directories(C INTERFACE include/C):

    • 由于include/CINTERFACEC本身不会使用include/C,但是任何依赖C的目标会使用这个路径。如果有一个目标D依赖于CD会使用include/C路径。
链接依赖:
  • target_link_libraries(B PUBLIC A): 由于APUBLICB不仅链接了A,而且任何依赖B的目标(比如C)也会自动链接A
  • target_link_libraries(C INTERFACE B): 由于BINTERFACEC本身不会链接B,但是任何依赖C的目标会链接BA(因为B是PUBLIC依赖A的)。

总结:

  • PRIVATE:只对目标自身生效,不传播。
  • PUBLIC:对目标自身和依赖目标都生效。
  • INTERFACE:对目标自身不生效,但传播给依赖目标。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024/9/21黑马头条跟学笔记(十)
  • Ubuntu 安装和使用 Fcitx 中文输入法;截图软件flameshot
  • 动态住宅IP的多元化应用
  • 网址匹配正则表达式(python实现)
  • 欺诈文本分类检测(十五)——数据校正与增强
  • 分布式消息中间件kafka
  • 计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 记一次docker打包部署历程
  • NoSql数据库Redis知识点
  • Python的串口通信库
  • 【学习笔记】手写Tomcat 四
  • 文件操作(3)
  • Python套接字
  • 植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
  • 一些线上常用排查问题的命令
  • $translatePartialLoader加载失败及解决方式
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【刷算法】从上往下打印二叉树
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ComponentOne 2017 V2版本正式发布
  • ECMAScript6(0):ES6简明参考手册
  • idea + plantuml 画流程图
  • Java读取Properties文件的六种方法
  • Netty 4.1 源代码学习:线程模型
  • Python学习之路13-记分
  • Spring Boot MyBatis配置多种数据库
  • 搭建gitbook 和 访问权限认证
  • 深入浅出Node.js
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 系统认识JavaScript正则表达式
  • 项目实战-Api的解决方案
  • 小程序开发之路(一)
  • 源码安装memcached和php memcache扩展
  • 怎样选择前端框架
  • 白色的风信子
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 2017年360最后一道编程题
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (19)夹钳(用于送货)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (规划)24届春招和25届暑假实习路线准备规划
  • (黑马C++)L06 重载与继承
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (排序详解之 堆排序)
  • (一)Linux+Windows下安装ffmpeg
  • (一)为什么要选择C++
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)iOS字体