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…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
