CMake 的继承关系

1. CMake如何确定继承关系

        在 CMake 中,父子关系是通过文件系统中的目录结构来定义的。当你在一个目录中创建一个 CMakeLists.txt 文件时,该目录就被视为一个 CMake 项目的目录,而该文件中的内容将被用于配置和构建该目录中的项目。

        当你在父目录的 CMakeLists.txt 文件中使用 `add_subdirectory()` 命令来包含子目录时,CMake 就会将子目录与父目录建立起父子关系。这意味着子目录中的 CMakeLists.txt 文件可以访问并继承父目录的变量、函数和设置,除非在子目录中显式地覆盖或修改了这些设置。

        因此,父子关系是由项目的目录结构和 `add_subdirectory()` 命令来确定的。只有在父目录中包含了子目录,并且在子目录中包含了父目录的设置时,才能说这两个目录之间存在父子关系。

2. 继承关系        

        在 CMake 项目中,`find_package()` 和 `target_link_libraries()` 分别用于查找和链接外部库。通常,当你在根目录的 CMakeLists.txt 文件中使用了这些命令,并且子目录的 CMakeLists.txt 文件没有覆盖或修改这些设置时,这些设置将会被继承到子目录中。

        在 CMake 中,当你在一个目录中包含另一个目录时,就会建立父子关系。这通常是通过在父目录的 CMakeLists.txt 文件中使用 `add_subdirectory()` 命令来实现的。

例如,假设有以下的目录结构:

project/
├── CMakeLists.txt (父目录)
├── subdirectory/
│   └── CMakeLists.txt (子目录)

在父目录的 CMakeLists.txt 文件中,你可以包含子目录,如下所示:

# 父目录的 CMakeLists.txt 文件
add_subdirectory(subdirectory)

        这样做后,子目录中的 CMakeLists.txt 文件就能够访问和继承父目录的设置。

        现在让我们考虑一个更具体的例子。假设在父目录的 CMakeLists.txt 文件中定义了一个变量 `FOO`,子目录的 CMakeLists.txt 文件也想使用这个变量。可以这样做:


# 父目录的 CMakeLists.txt 文件
set(FOO "Hello from the parent directory")add_subdirectory(subdirectory)# 子目录的 CMakeLists.txt 文件
message("In the subdirectory: ${FOO}")

        在这个例子中,子目录的 CMakeLists.txt 文件能够访问并使用父目录中定义的变量 `FOO`,因为父目录通过 `add_subdirectory()` 命令包含了子目录。

        因此,父目录和子目录之间的关系建立在包含关系的基础上,而不是在代码中直接指定父子关系。只要在父目录中包含了子目录,并且子目录中的 CMakeLists.txt 文件使用了父目录中定义的设置,就可以说这两个目录之间存在父子关系。

        以上说明的是显示的继承关系,也包含隐式的继承关系,如果子目录的 CMakeLists.txt 文件没有使用父目录中定义的任何变量、函数或设置,并且没有任何其他方式显式地依赖于父目录,那么可以说它们之间没有显式的父子关系。

        在这种情况下,尽管你可能在父目录的 CMakeLists.txt 文件中使用了 `add_subdirectory()` 命令包含了子目录,但子目录不会继承父目录的任何设置或变量,也不会被视为父目录的子项目。相反,子目录会被视为独立的项目,它们之间的联系仅限于目录结构。

        这种情况下的父子关系是隐式的,因为你使用了 `add_subdirectory()` 命令包含了子目录,但子目录并没有直接依赖于父目录。

        这种继承关系主要表现在项目构建过程中。当你在父目录中执行 CMake 构建时,它会递归地构建子目录,从而构建整个项目。因此,子目录会受到父目录构建过程的影响,即使子目录中的 CMakeLists.txt 文件没有显式地引用父目录的设置或变量。

        这种继承关系主要影响构建过程,而不会直接影响 CMake 变量或设置的传递。如果在子目录中需要访问父目录的设置或变量,仍然需要在子目录的 CMakeLists.txt 文件中显式地引用它们。

3. 其他        

        在 CMake 中,`find_package()` 和 `target_link_libraries()` 命令的行为取决于它们的位置和作用域。通常情况下,子目录的 CMakeLists.txt 文件中的命令会覆盖父目录中相同名称的命令。

        但是,如果在子目录的 CMakeLists.txt 文件中使用了 `PRIVATE`、`PUBLIC` 或 `INTERFACE` 关键字将目标链接到库时,它会将链接的设置限定在当前目标中,而不会影响到父目录或其他目标。这意味着,即使子目录中使用了 `target_link_libraries()` 命令,也不会影响到父目录的设置。

        因此,如果子目录的 CMakeLists.txt 文件中的 `target_link_libraries()` 命令没有将目标链接到 某个库,那么父目录中的 连接到这个库的设置仍然会保持有效,并且可以在子目录中使用 这个库的头文件和链接库,而不会报错。

当在子目录的 CMakeLists.txt 文件中使用 `target_link_libraries()` 命令时,如果使用了 `PUBLIC`、`PRIVATE` 或 `INTERFACE` 关键字,它们会指定链接的属性范围。具体来说:

PUBLIC: 当使用 `PUBLIC` 关键字时,链接的设置会应用于当前目标和所有依赖该目标的目标。这意味着,这些设置会被继承到依赖目标中,同时也会保留在当前目标中。

PRIVATE: 当使用 `PRIVATE` 关键字时,链接的设置仅适用于当前目标,不会被传递到依赖目标中。

INTERFACE: 当使用 `INTERFACE` 关键字时,链接的设置不会应用于当前目标,而是仅应用于依赖目标。这意味着,这些设置会被传递到依赖目标中,但不会影响当前目标。

        因此,如果在子目录的 CMakeLists.txt 文件中使用了 `target_link_libraries()` 命令,并且使用了 `PUBLIC` 关键字,那么链接的设置会同时继承父目录的设置,并保留在当前目标中。这样既可以继承父目录的设置,又可以在子目录中保留自己的设置,不会覆盖父目录的设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同路径| 和 不同路径||

不同路径| 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&#xf…

Tomcat启动闪退问题解决办法

本文将通过一系列诊断步骤帮助您找出原因,并提供相应的解决办法。 诊断步骤 查看日志文件 Tomcat的日志文件是解决启动问题的第一线工具。查看logs目录下的catalina.out和其他日志文件,这些文件经常记录了错误信息和系统崩溃的线索。 cat /path/to/to…

C++编程与朱元墇的关系

学编程和英语没关系,我说这句话,没人会相信,也不会有人说我什么哗众取宠。 我说学编程和朱元墇有关系,一定有人说我放P,其实这个P也和朱元墇有关系, 和朱元墇有什么P关系啊。 真有这P事啊, 朱元…

LeetCode刷题笔记之图论

1. 797【所有可能的路径】 题目: 给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)。graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xf…

大学生体质测试|基于Springboot+vue的大学生体质测试管理系统设计与实现(源码+数据库+文档)

大学生体质测试管理系统 目录 基于Springboot+vue的大学生体质测试管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 4教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算…

MySQL数据库基础功能

MySQL是一种常用的关系型数据库管理系统,它广泛应用于网站开发、数据分析和其他许多领域。 咋可以不专业搞这个,但是基础的最好能看懂和应用,快去学习吧 下面是10个不同案例,展示MySQL的用法。 ①创建数据库:使用CR…

C++笔试强训day20

目录 1.经此一役小红所向无敌 2.连续子数组最大和 3.非对称之美 1.经此一役小红所向无敌 链接 简单模拟即可。 需要注意的是&#xff1a; 除完之后有无余数&#xff0c;若有&#xff0c;则还可以再挨一次打。 #include <iostream> using namespace std; #define in…

设计模式——结构型模式——代理模式(静态代理、动态代理:JDK、CGLIB)

目录 代理模式 代理模式简介 代理模式的分类 代理模式组成 代理模式的优缺点 静态代理 背景前置 编写代码 JDK动态代理 编写代码 使用Arthas分析JDK动态代理底层原理 CGLIB动态代理 编写代码 三种代理的对比 代理模式使用场景 代理模式 代理模式简介 代理模式属…

Mybatis操作数据库的两种方式:Mapper代理模式

1.Mapper代理模式的特点 程序员没有写接口的子实现——直接获取数据库的数据 因为Mybatis定义了一套规则&#xff0c;对方法进行了实现&#xff0c;程序员只要遵循这套方法就可以直接使用 2.如何实现Mapper代理模式 步骤&#xff1a; 1.创建一个dao接口&#xff0c;在接口…

java项目之英语知识应用网站源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的英语知识应用网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 英语知识应用网站的主要…

【免费】AME最新Adobe Media Encoder电脑软件安装包2024-2018支持WIN和MAC

Adobe MediaEncoder「Me」2024是一款功能强大的转码和媒体处理软件&#xff0c;它不仅能轻松应对各种媒体文件的编码和导出需求&#xff0c;还支持多种视频格式和分辨率&#xff0c;让你的视频处理变得更加高效。此外&#xff0c;该软件界面简洁明了&#xff0c;操作简便&#…

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努…

【Element-UI快速入门】

文章目录 **Element-UI快速入门****一、Element-UI简介****二、安装Element-UI****三、引入Element-UI****四、使用Element-UI组件****五、自定义Element-UI组件样式****六、Element-UI布局组件****七、Element-UI表单组件****八、插槽&#xff08;Slots&#xff09;和主题定制…

【数据结构】排序(一)—— 希尔排序(思路演进版)

目录 一、常见的排序算法分类 二、常见排序算法的实现 2.1插入排序 2.1.1基本思想 2.1.2直接插入排序 思路 step1.单趟控制 step2.总体控制 代码实现 测试 特性总结 2.1.3 希尔排序( 缩小增量排序 ) 基本思想 思路演进 &#x1f308;1.代码实现单组排序&#…

你能坚持二十年如一日地积极试错吗?

你能坚持二十年如一日地积极试错吗&#xff1f;先说一个大家都耳熟能详的人物&#xff1a;克里斯托弗哥伦布&#xff0c;他被称为新大陆的发现者&#xff0c;是具有极高历史地位的伟大航海家。 但是新大陆本来就不是所谓的“新”大陆&#xff0c;而是在4万年前从白令海峡迁徙过…

端午节线上活动方案怎么写?

一年一端午&#xff0c;一岁一安康。 如果您想组织端午活动&#xff0c;却不知道如何安排&#xff0c;可以看看何策网&#xff0c;有很多案例参考&#xff0c;仿造模板修改即可。 下面分享一个线上端午节活动策划方案&#xff0c;希望能帮到你&#xff01; 端午节作为祭祖祈…

Qt 实现TCP 协议的断开重连

在Qt中实现TCP断开重连&#xff0c;你可以使用QTcpSocket类&#xff0c;并结合QTimer来处理重连逻辑&#xff0c;在Qt中实现TCP断开后的自动重连功能&#xff0c;通常可以通过以下步骤进行&#xff1a; 1. 初始化QTcpSocket&#xff1a; 首先&#xff0c;需要创建一个QTcpSock…

Docker使用注意事项

docker import 和 docker load 有什么区别&#xff1f; 想要了解 docker load 与 docker import 命令的区别&#xff0c;还必须知道 docker save 与 docker export docker save&#xff1a;将一个镜像导出为文件&#xff0c;再使用docker load命令将文件导入为一个镜像&#…

mysql集群NDBcluster引擎在写入数据时报错 (1114, “The table ‘ads‘ is full“)

问题描述&#xff1a;mysql集群在写入数据时&#xff0c;出现上述报错 问题原因&#xff1a;表数据已满&#xff0c;一般是在集群的管理节点设置里面datamemory的值太小&#xff0c;当数据量超过该值时就会出现该问题 解决方案&#xff1a; 修改集群管理节点的config.ini里面…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习2

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环练习2 1、 for i in range(3):Dev.turnRight()for j in range(3):Dev.step(-3)Dev.turnRight()Dev.step(4-2*i)2、 for i in range(6):for j in range(2):Dev.step(2 2 * i)if i > 3: Dev.step(i - 2)Dev.turnRi…