cmake CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR的区别
在 CMake 中,CMAKE_CURRENT_LIST_DIR 和 CMAKE_CURRENT_SOURCE_DIR 都是指代当前 CMake 文件所在的路径,但它们的含义和用途有所不同:
-
CMAKE_CURRENT_LIST_DIR:- 表示 当前处理的 CMake 文件(例如
CMakeLists.txt)所在的目录路径。 - 这个变量的值是相对当前 CMake 文件的位置。如果你的 CMake 文件包含其他的子目录或
include()语句,它将为每一个被处理的 CMake 文件指向不同的路径。 - 用法场景:当你需要知道某个特定 CMake 文件的位置时使用,尤其是当项目中有多个 CMake 文件或模块时。
例如:
message("Current CMake file directory: ${CMAKE_CURRENT_LIST_DIR}") - 表示 当前处理的 CMake 文件(例如
-
CMAKE_CURRENT_SOURCE_DIR:- 表示 当前 CMake 处理的源代码目录,即当前作用域的源代码根目录。
- 当你在 CMake 构建过程中进入子目录时,
CMAKE_CURRENT_SOURCE_DIR会一直指向当前 CMake 配置的源目录,即调用add_subdirectory()时传递的路径。 - 这个变量在整个 CMake 配置过程中是相对一致的,并不随当前处理的 CMake 文件改变。
例如:
message("Current source directory: ${CMAKE_CURRENT_SOURCE_DIR}")
主要区别:
CMAKE_CURRENT_LIST_DIR更加局部,跟当前处理的 CMake 文件位置相关。CMAKE_CURRENT_SOURCE_DIR则是全局性更强,指代整个 CMake 配置过程中的当前源代码目录。
例子:
假设项目结构如下:
project/
├── CMakeLists.txt
├── src/
│ └── CMakeLists.txt
└── build/
在 src/CMakeLists.txt 中:
CMAKE_CURRENT_LIST_DIR会是project/src,因为这是当前CMakeLists.txt文件所在的目录。CMAKE_CURRENT_SOURCE_DIR会是project,即项目的根目录。
通过理解这些差异,你可以更灵活地在 CMake 文件中引用路径,确保正确地处理文件路径和源代码目录。
好的,我来试试用更简单的方式解释一下!
CMAKE_CURRENT_LIST_DIR:
- 意思:它指的是当前正在被 CMake 处理的那个 文件 所在的文件夹。
- 举个例子:如果你在
src/CMakeLists.txt里使用了CMAKE_CURRENT_LIST_DIR,它会返回src文件夹的路径。 - 重点:这个变量是跟你 当前正在处理的 CMake 文件 相关的,不是整个项目的源代码目录。
CMAKE_CURRENT_SOURCE_DIR:
- 意思:它指的是当前 CMake 项目在构建时的 源代码目录,即你最开始运行
cmake命令时传入的那个目录。 - 举个例子:如果你在
src/CMakeLists.txt里使用了CMAKE_CURRENT_SOURCE_DIR,它会返回你整个项目的根目录路径,也就是包含src和CMakeLists.txt的上级目录。 - 重点:这个变量是跟你的 整个项目的源代码目录 相关的,跟你当前在哪个文件夹都没有关系。
再举个简单的例子:
假设你的项目结构是这样的:
my_project/
├── CMakeLists.txt
├── src/
│ └── CMakeLists.txt
└── build/
-
如果你在
src/CMakeLists.txt里面写了:message("Current list dir: ${CMAKE_CURRENT_LIST_DIR}")输出会是:
/path/to/my_project/src(即src文件夹的路径)。 -
如果你在
src/CMakeLists.txt里面写了:message("Current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")输出会是:
/path/to/my_project(即整个项目的根目录路径)。
总结:
CMAKE_CURRENT_LIST_DIR跟 当前正在处理的 CMake 文件 所在的目录有关。CMAKE_CURRENT_SOURCE_DIR跟 整个项目的源代码根目录 有关。
没问题!我再解释一下,尽量更简单一些。
源代码根目录
“源代码根目录”指的是你整个 CMake 项目最上层的那个文件夹,也就是你在命令行运行 cmake 的地方,或者你在 CMake 中配置项目时指定的那个目录。
假设你的项目文件夹结构是这样:
my_project/ ← 这是整个项目的根目录
├── CMakeLists.txt ← 这是根目录下的 CMake 配置文件
├── src/
│ └── CMakeLists.txt ← 这是 src 文件夹里的 CMake 配置文件
└── build/
这里:
my_project/就是 整个项目的源代码根目录,也就是你放 CMake 配置文件(CMakeLists.txt)和源代码文件的顶层目录。
CMake 的两个变量
-
CMAKE_CURRENT_SOURCE_DIR:- 这个变量指的是 CMake 正在处理的 CMake 文件所在的目录。
- 如果你在
my_project/src/CMakeLists.txt里用这个变量,它返回的就是my_project/(根目录),因为你在根目录下运行cmake。
-
CMAKE_CURRENT_LIST_DIR:- 这个变量指的是 当前 CMake 文件所在的目录。
- 如果你在
src/CMakeLists.txt里用这个变量,它返回的就是my_project/src,因为你在src文件夹里有一个 CMake 文件。
举个简单例子:
假设你有这样一个项目:
my_project/
├── CMakeLists.txt
├── src/
│ └── CMakeLists.txt
└── build/
-
如果你在
my_project/src/CMakeLists.txt中写:message("CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")输出会是:
/path/to/my_project,也就是整个项目的根目录。 -
如果你在
my_project/src/CMakeLists.txt中写:message("CMAKE_CURRENT_LIST_DIR: ${CMAKE_CURRENT_LIST_DIR}")输出会是:
/path/to/my_project/src,也就是src文件夹的路径。
关键点:
CMAKE_CURRENT_SOURCE_DIR是你 整个项目 的源代码根目录,通常就是你运行cmake命令的那个目录(比如my_project/)。CMAKE_CURRENT_LIST_DIR是当前 处理的 CMake 文件 所在的目录,比如你当前在src/CMakeLists.txt中,它就是my_project/src。
你说得对,我最后的描述有些不准确,感谢你指出来!让我来纠正一下:
正确的解释:
-
CMAKE_CURRENT_SOURCE_DIR:- 意思:它指的是 当前 CMake 处理的源代码目录,即你在运行
cmake命令时指定的那个目录。这个目录通常是项目的根目录,或者是某个子目录(如果你在子目录里运行了cmake)。 - 举个例子:如果你在
my_project/(整个项目的根目录)运行cmake,CMAKE_CURRENT_SOURCE_DIR就会是my_project/,即源代码的根目录。
- 意思:它指的是 当前 CMake 处理的源代码目录,即你在运行
-
CMAKE_CURRENT_LIST_DIR:- 意思:它指的是 当前正在被处理的 CMake 文件 所在的目录。也就是说,如果你在
src/CMakeLists.txt里,它就是my_project/src/,如果你在my_project/CMakeLists.txt里,它就是my_project/。 - 举个例子:如果你在
my_project/src/CMakeLists.txt文件中用CMAKE_CURRENT_LIST_DIR,它会返回my_project/src/。这是因为这个变量是基于当前 CMake 文件所在位置的。
- 意思:它指的是 当前正在被处理的 CMake 文件 所在的目录。也就是说,如果你在
正确的区别总结:
CMAKE_CURRENT_SOURCE_DIR是基于 CMake 配置源代码时的起始目录,一般来说,这个目录会是项目的根目录,或者是你运行cmake命令时指定的目录。CMAKE_CURRENT_LIST_DIR是基于 当前 CMake 文件所在的目录,也就是你正在处理的那个CMakeLists.txt文件的目录。
例子再梳理一遍:
假设项目结构如下:
my_project/ ← 项目的根目录
├── CMakeLists.txt ← 项目的 CMake 配置文件
├── src/ ← 源代码目录
│ └── CMakeLists.txt ← src 下的 CMake 配置文件
└── build/ ← 构建目录
-
CMAKE_CURRENT_SOURCE_DIR:- 如果你在
my_project/src/CMakeLists.txt里用它,返回的就是my_project/(项目根目录)。 - 如果你在
my_project/CMakeLists.txt里用它,返回的也是my_project/(项目根目录)。
- 如果你在
-
CMAKE_CURRENT_LIST_DIR:- 如果你在
my_project/src/CMakeLists.txt里用它,返回的就是my_project/src/(src文件夹的路径)。 - 如果你在
my_project/CMakeLists.txt里用它,返回的就是my_project/(项目根目录)。
- 如果你在
相关文章:
cmake CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR的区别
在 CMake 中,CMAKE_CURRENT_LIST_DIR 和 CMAKE_CURRENT_SOURCE_DIR 都是指代当前 CMake 文件所在的路径,但它们的含义和用途有所不同: CMAKE_CURRENT_LIST_DIR: 表示 当前处理的 CMake 文件(例如 CMakeLists.txt&#…...
学会用VSCode debug
本文主要介绍了 VS Code 的调试功能,包括其强大的内置调试器,支持多种语言,如 JavaScript、TypeScript 等。通过简单项目示例展示调试过程,还介绍了运行面板和菜单、启动配置、调试操作、断点、记录点等功能,以及三种调…...
C语言专题之结构体的使用
结构体(struct)是一种用户自定义的数据类型,它允许将不同类型的数据组合在一起,形成一个新的数据类型。结构体在编程中非常常见,尤其是在需要处理复杂数据结构的情况下。以下是结构体的基本使用方法: 一、结…...
python中的高阶函数
1、什么是高阶函数? 高阶函数是指将函数作为参数传入。就是高阶函数 2、高阶函数有哪些? map 映射函数 >>> print(list(map(lambda x:x*x,range(1,11)))) [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] >>> print(list(map(lambda x:st…...
学习笔记063——通过使用 aspose-words 将 Word 转 PDF 时,遇到的字体改变以及乱码问题
文章目录 1、问题描述:2、解决方法: 1、问题描述: Java项目中,有个需要将word转pdf的需求。本人通过使用aspose-words来转换的。在Windows中,转换是完全正常的。但是当部署到服务器时,会出现转换生成的pdf…...
SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试
Mock概念 Mock叫做模拟对象,即用来模拟未被实现的对象可以预先定义这个对象在特定调用时的行为(例如返回值或抛出异常),从而模拟不同的系统状态。 导入Mock依赖 pom文件中引入springboot测试依赖,spring-boot-start…...
【AI知识】过拟合、欠拟合和正则
一句话总结: 过拟合和欠拟合是机器学习中的两个相对的概念,正则化是用于解决过拟合的方法。 1. 欠拟合: 指模型在训练数据上表现不佳,不能充分捕捉数据的潜在规律,导致在训练集和测试集上的误差都很高。欠拟合意味着模…...
MacOS编译webRTC源码小tip
简单记录一下,本人在编译webRTC时,碰到了一下比较烦人的问题,在MacOS终端下,搭建科学上网之后,chromium的depot_tools仓库成功拉下来了,紧接着,使用fetch以及gclient sync始终都返回curl相关的网…...
Linux基础命令(三):文件压缩及解压缩命令
文件压缩及解压缩命令 tar — 打包和压缩 tar 是一个用于打包文件的工具,常常用来将多个文件或目录打包成一个单独的文件。它本身不进行压缩,但可以与压缩工具(如 gzip 或 bzip2)一起使用。 用法: 打包文件࿰…...
目标跟踪算法:ByteTrack、卡尔曼滤波、匈牙利算法、高置信度检测目标、低置信度检测目标
目录 1 ByteTrack特点 2 ByteTrack和SORT区别----个人通俗理解 3 ByteTrack算法原理 4 ByteTrack整体流程图 上一篇博客我复习了下SORT跟踪算法,这一篇博客我再复习下ByteTrack跟踪算法,ByteTrack里面也是用了卡尔曼滤波和匈牙利算法&#x…...
[定昌linux系统]如何安装jdk8
1:下载jdk8 的 arm64 的版本,由于官方下载需要gmail,我的gmail 密码忘了,所以从csdn上下载了一份,地址: https://download.csdn.net/download/qq_27742163/88533548?utm_mediumdistribute.pc_relevant_download.none…...
【Cadence32】PCB多层板电源、地平面层创建心得➕CM约束管理器Analyze分析显示设置➕“DP”报错DRC
【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…...
基于SpringBoot+Vue的新闻管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展,信息传播速度不断加快,新闻媒体行业面临着巨大的机遇与挑战。传统的新闻媒体正在逐渐向数字化转型,而新闻管理系统作为数字化新闻媒体的核心组成部分,其…...
图的割点、割边(Tarjan算法)
深度优先搜索的利用。 在一个无向连通图中,如果删掉某个顶点后,图不再连通(即任意两点之间不能互相到达),我们称这样的顶点为割点。 在一个无向连通图中,如果删掉某条边后,图不在连通࿰…...
算法学习(十四)—— 二叉树的深度搜索(DFS)
目录 关于dfs 部分OJ题详解 2331. 计算布尔二叉树的值 129. 求根节点到叶节点数字之和 814. 二叉树剪枝 98. 验证二叉搜索树 230. 二叉搜索树中第K小的元素 257. 二叉树的所有路径 关于dfs 算法学习(十二)—— 递归,搜索,…...
【vue2】封装自定义的日历组件(三)之基础添加月份的加减定位到最新月份的第一天
我们在切换月份的时候,希望高亮显示在每个月的第一天上面,这样的效果我们要怎么来实现,其实也很简单,我们先看下实现的效果 实现效果 代码实现 原理就是获取到每月的第一天日期,然后再跟整个的数据进行对比ÿ…...
LabVIEW偏心圆筒流变仪测控系统
偏心圆筒流变仪是一种专门研究聚合物熔体在复杂流场中特殊流变行为的先进设备。通过结合硬件控制与LabVIEW软件开发,本系统实现了对流变仪功能的精准控制与数据采集,进一步提高了聚合物加工过程的研究精度和效率。 项目背景 传统的流变测量设备多集中于…...
Runloop
假设你的项目中有关tableView,然后还有一个定时器timer在执行,定时器代码如下: var num 0override func viewDidLoad() {super.viewDidLoad()let timer Timer(timeInterval: 1,target: self,selector: #selector(self.run),userInfo: nil,r…...
SpringBoot的Bean类三种注入方式(附带LomBok注入)
SpringBoot的Bean类三种注入方式(附带LomBok注入) 在 Spring Boot 中,Bean 的注入方式主要包括构造函数注入(Constructor Injection)、字段注入(Field Injection)以及 Setter 方法注入…...
开源向量数据库介绍说明
开源向量数据库 Milvus 特点:分布式、高性能,支持亿级向量检索。 支持的数据类型:文本、图像、音频、视频等。 使用场景:推荐系统、语义搜索、图像搜索。 数据存储后端:支持多种后端,如 SQLite、MySQL、Pos…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
