当前位置: 首页 > 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/a/314301.html

相关文章:

  • 浪潮信息“源”Embedding模型登顶MTEB榜单第一名
  • 在JPA和EJB中用乐观锁解决并发问题
  • Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
  • 新版 idea 编写 idea 插件时,启动出现 ClassNotFound
  • TCP/IP协议,TCP和UDP区别
  • Prometheus面试内容整理-Prometheus 的架构和工作原理
  • 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日志收集平台