CMake中的PUBLIC、PRIVATE 和 INTERFACE用法

server/2024/9/22 1:29:46/

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

1. PRIVATE

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

2. PUBLIC

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

3. INTERFACE

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

举例说明

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

例子代码结构:
cmake">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.ppmy.cn/server/120063.html

相关文章

[Python可视化]数据可视化在医疗领域应用:提高诊断准确性和治疗效果

随着医疗数据的增长,如何从庞大的数据集中快速提取出有用的信息,成为了医疗研究和实践中的一大挑战。数据可视化在这一过程中扮演了至关重要的角色,它能够通过图形的方式直观展现复杂的数据关系,从而帮助医生和研究人员做出更好的…

【Linux实践】实验二:LINUX操作基础

【Linux实践】实验二:LINUX操作基础 实验目的实验内容实验步骤及结果1. 打开终端2. 关闭计算机命令3. 查看帮助文档4. 修改计算机主机名5. 显示月历和时间6. 统计行数、字符数、单词数 这章开始要涉及到命令了,其他关于命令的内容可以看我 2021年写的笔记…

arcgisPro地理配准

1、添加图像 2、在【影像】选项卡中,点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点,然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮,选择【一阶多项式(仿射)】变换 7…

PG表空间

目录标题 PG表空间PostgreSQL表空间的最佳实践是什么?如何在PostgreSQL中创建和管理自定义表空间?PostgreSQL表空间对数据库性能的具体影响有哪些?在PostgreSQL中,如何迁移数据到不同的表空间以优化存储布局?PostgreSQ…

【数据结构初阶】链式二叉树接口实现超详解

文章目录 1. 节点定义2. 前中后序遍历2. 1 遍历规则2. 2 遍历实现2. 3 结点个数2. 3. 1 二叉树节点个数2. 3. 2 二叉树叶子节点个数2. 3. 3 二叉树第k层节点个数 2. 4 二叉树查找值为x的节点2. 5 二叉树层序遍历2. 6 判断二叉树是否是完全二叉树 3. 二叉树性质 1. 节点定义 用…

代码随想录算法训练营DAY09之动态规划(一)基础题目

理论基础: 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。 例子: 例如&a…

Vue|mixin混入

目录 mixin混入什么是mixin代码准备如何混入?全局混合 在 Vue 中,混入(Mixins)是一种灵活的分发功能,可以将可复用的代码片段和功能注入到多个组件中。简单来说,混入允许你在多个组件之间共享逻辑,而无需重…

JetLinks物联网学习(前后端项目启动)

前后端项目启动 1、后端1.1 pgsql改mysql报错2、elasticSearch7.0版本以上_doc格式取消 2、前端 1、后端 环境准备: 1、window系统7,8,10 。 硬件资源最低要求4c8G,硬盘40G 2、JDK 1.8.0_2xx (需要小版本号大于200) 3、Maven3.6.3 4、Redis …