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

http://www.mrgr.cn/news/33062.html

相关文章:

  • 国产系统给在线的Word文件创建表格
  • 什么是量化交易
  • Ubuntu配置阿里云docker apt源
  • 【api】java和python联动
  • 安装仓库,ssh连接与nfs共享文件
  • 图片的鱼眼批量矫正算法
  • 楼宇自动巡检小车设计
  • 借10万块,年化利息明明是3.8%,为啥就变成了2.07%?
  • 【软考】传输层协议TCP与UDP
  • C++智能指针入门教程(C++11)
  • OpenGL渲染管线(Rendering Pipeline)介绍
  • proteus仿真学习(1)
  • 【笔记】1.3 塑性变形
  • PAT甲级-1086 Tree Traversals Again
  • Apipost IDEA插件新升级,Apipost Helper上架IDEA插件市场
  • 基于SpringBoot+Vue的高校门禁管理系统
  • 万字长文——ConvNeXt(2022CVPR),卷积网络的顶峰之作,在Transformer盛行的当下,卷积网络还能再战!
  • C++——求3*3矩阵主对角元素之和。
  • unity3d入门教程八-飞机大战
  • 基于协同过滤算法的商品推荐系统
  • 索引设计的5个原则
  • TCP四大拥塞控制算法总结
  • windows安装Anaconda教程
  • springboot注册和注入组件方式概览
  • BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?
  • 暴力枚举算法