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.mfbz.cn/a/604124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cesium雷达遮罩(轨迹球效果)

cesium 雷达遮罩(轨迹球效果) 以下为源码直接复制可用 1、实现思路 通过修改“material”材质来实现轨迹球效果 2、代码示例 2.1 index.html <!DOCTYPE html> <html lang="en"><head><!

【刷题篇】双指针(二)

文章目录 1、有效三角形的个数2、查找总价格为目标值的两个商品3、三数之和4、四数之和 1、有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 class Solution { public:int triangleNumber(vector<int>& n…

u盘数据突然不见了怎么回事 u盘数据为什么无故不见如何恢复

当我们把文档资料保存好并复制到U盘后&#xff0c;发现刚才保存的资料没了&#xff0c;并且连文档都不见了&#xff0c;不过文件夹还在U盘。那么U盘数据突然不见了怎么回事呢?U盘数据突然不见了怎么办? 一、U盘数据突然不见了怎么回事 有许多原因可能导致u盘数据无故消失&a…

伪装目标检测论文阅读之Dual-SAM(CVPR-2024)

论文&#xff1a;link code&#xff1a;code Fantastic Animals and Where to Find Them:Segment Any Marine Animal with Dual SAM 摘要 作为水下智能的重要支柱&#xff0c;海洋动物分割(MAS)涉及对海洋环境中的动物进行分割。以往的方法在提取长范围上下文特征方面表现不佳…

内存卡突然罢工?数据恢复有高招!

内存卡作为我们日常生活中常见的存储设备&#xff0c;广泛应用于手机、相机等设备中。然而&#xff0c;有时我们会遇到内存卡损坏打不开的情况&#xff0c;这时该如何应对呢&#xff1f;本文将为您详细解析内存卡损坏的原因&#xff0c;并提供有效的数据恢复方案&#xff0c;帮…

PyQt5的基本安装与使用

文章目录 1. 简介2.安装2.1.QtDisigner配置2.2 PyUIC配置2.3. PyRCC配置 3. 一个简单的PyQt5使用示例 1. 简介 PyQt5是一个用于创建交互式界面的Python库&#xff0c;它是基于Qt框架的Python绑定。Qt是一个跨平台的C框架&#xff0c;用于开发图形用户界面&#xff08;GUI&…

4.26.7具有超级令牌采样功能的 Vision Transformer

Vision Transformer在捕获浅层的局部特征时可能会受到高冗余的影响。 在神经网络的早期阶段获得高效且有效的全局上下文建模&#xff1a; ①从超像素的设计中汲取灵感&#xff0c;减少了后续处理中图像基元的数量&#xff0c;并将超级令牌引入到Vision Transformer中。 超像素…

源代码加密的重要性

在数字化时代&#xff0c;企业面临的最大挑战之一是如何保护其核心数据不被泄露。企业源代码防泄密是指企业采取措施保护其软件或应用程序源代码不被未授权的人员获取、泄露或盗用的一种安全措施。源代码是软件的核心组成部分&#xff0c;其中包含了程序员编写的具体指令和算法…

MySQL深入理解MVCC机制(详解)

深入理解MVCC 1、MVCC定义 MVCC:Multi-Version Concurrency Control&#xff0c;多版本并发控制机制。 在mysql中&#xff0c;为了满足事务的四大特性之一的隔离性&#xff0c;就是当前事务中的查询的数据不受其他事务的增删改操作的影响&#xff0c;因此mysql主要是通过这个…

怎么解决端口被占用

目录 一、引言 二、解决方法 一、引言 最近用vscode写网页&#xff0c;老是遇见端口被占用&#xff0c;报错如下&#xff1a; listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. 二、解决方法 1.换…

Apache DolphinScheduler 3.3.0 版本重磅更新提前看!

Apache DolphinScheduler 3.3.0版本终于要在万众期待中发布啦&#xff01;本次发版将有重大功能更新&#xff0c;包括架构上的调整。 为了让广大用户提前尝鲜&#xff0c;社区特别准备了直播活动提前揭秘3.3.0版本中的重要更新&#xff0c;到时候你将会了解到这些信息&#xf…

苹果平板HOME键成历史,全面屏时代到来?2024平板电脑市场趋势分析

近期苹果公司在“放飞吧”发布会上推出了新款iPad Pro和iPad Air平板电脑&#xff0c;并下架了最后一款带有实体Home按键的iPad 9。这一变化标志着Home键在苹果iPad产品线中成为了历史&#xff0c;引起了不少网友的怀念和感慨。 与此同时&#xff0c;今年3月线上平板电脑市场迎…

分析:Palo Alto在从SASE向SASO演进中定位不佳

摘要 我们通过上一篇文章&#xff08;Fortinet的愿景——超越SASE&#xff09;中应用于Fortinet的相同框架来回顾Palo Alto Network在网络和网络安全方面的前景。 SASE涉及数据传输的第一英里。不过&#xff0c;随着SASE的发展&#xff0c;投资者还需要考虑中间和最后一英里。…

QLabel 如何同时显示图片和文字?

效果: align="top"表示图片和文字底部对齐。 img src=":/img/qrc_img.png"表示此图片被添加到qrc的相对路径。 完整: QString content =QString("<html><head/><body><p><img src=\":/img/qrc_img.png\"…

【linux kernel】linux内核hid触摸源码hid-multitouch.c剖析

文章目录 一、内核中通用hid触摸驱动二、probe过程剖析(1)hid_parse()函数(2)hid_hw_start()函数(3)hid_connect()函数三、hid-multitouch.c应用场景一、内核中通用hid触摸驱动 在linux内核中,为HID触摸面板实现了一个通用的驱动程序,位于/drivers/hid/hid-multitouch.c文件…

【高阶数据结构】图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime

图--邻接矩阵、邻接表、BFS、DFS、Kruskal、Prime 一、图的概述1、概述&#xff08;纯理论部分&#xff09;2、邻接矩阵&#xff08;实现一个添加边的图&#xff09;&#xff08;1&#xff09;思路介绍&#xff08;2&#xff09;代码部分&#xff08;3&#xff09;测试部分 3、…

pytest教程-40-钩子函数-pytest_runtest_call

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_runtest_setup钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_runtest_call钩子函数的使用方法。 pytest_runtest_call 钩子函数在 pytest 调用测试函数&#xff08;即测试用…

JAVA栈相关习题3

1.将递归转化为循环 比如&#xff1a;逆序打印链表 // 递归方式void printList(Node head){if(null ! head){printList(head.next);System.out.print(head.val " ");}} // 循环方式void printList(Node head){if(nullhead){return;}Stack<Node> snew Stack<…

将大概的流程具体还是看源码

之前看源码的时候呢没有文字整理&#xff0c;想来还是写一个大概的流程吧&#xff0c;具体是无法用文字描述 spring源码真的yyds&#xff0c;数据结构 反射 父子类 接口…玩得溜到飞起 博大精深呐 后期不断喜欢ing&#xff01; springApplication.run方法 获取了一个Configu…

STC8增强型单片机开发——库函数

一、使用库函数点灯 导入库函数。 下载STC8H的库函数&#xff1a;&#x1f4ce;STC8G-STC8H-LIB-DEMO-CODE_2023.07.17_优化版.zip 来到库函数的目录下&#xff0c;拷贝以下文件&#xff1a; Config.hType_def.hGPIO.hGPIO.c 新建项目&#xff0c;将拷贝的4个文件放到项目目录…