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

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:对目标自身不生效,但传播给依赖目标。

http://www.kler.cn/news/314301.html

相关文章:

  • C++ | Leetcode C++题解之第423题从英文中重建数字
  • 【CPU】CPU的物理核、逻辑核、超线程判断及L1、L2、L3缓存、CacheLine和CPU的TBL说明
  • vue-入门速通
  • C++_数据结构详解
  • MATLAB入门基础篇
  • 一个安卓鸿蒙化工具
  • SpringBoot环境配置(Spring Boot Profile)
  • sql执行流程经典案例分析
  • 从Profinet到Ethernet IP网关技术重塑工业网络,数据传输更流畅
  • Go语言并发编程中的超时与取消机制解析
  • 基于菜鸟教程的flask学习记录 —— Flask视图函数
  • Java.猜数字小游戏
  • Go 语言字典探秘:操作指南与约束解析
  • Git之如何删除Untracked文件(六十八)
  • MySQL的索引——提高查找算法的数据结构 B+树
  • Qt容器类控件——QGroupBox和QTabWidget
  • 计算机网络(月考一知识点)
  • Windows安装Oracle11gR2(图文教程)
  • Docker部署ddns-go教程(包含完整的配置过程)
  • 基于 K8S kubernetes 搭建 安装 EFK日志收集平台
  • 深度学习实战93-基于BiLSTM-CRF模型的网络安全知识图谱实体识别应用
  • CTC loss 博客转载
  • C++(2)进阶语法
  • 职业技能大赛-自动化测试笔记分享-2
  • 长亭WAF绕过测试
  • Spring AI Alibaba,阿里的AI Java 开发框架
  • 【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
  • C语言CRC16_CCITT_FALSE函数法和查表法实现
  • ArcGIS10.2/10.6安装包下载与安装(附详细安装步骤)
  • Unity坐标系求向量的模长