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…...
AI计算工作量化模型:跨硬件效能评估与能效优化
1. AI工作量化模型的核心价值与应用场景在当今AI技术快速渗透到各行各业的背景下,如何准确衡量AI系统的计算效率和工作量成为一个关键问题。传统上,我们使用FLOPs(每秒浮点运算次数)等指标来评估计算性能,但这些指标存…...
在职场上,别人对你的态度,都是你允许的:“他为什么敢这样对我?”“他为什么不怕得罪我?”“我有什么好怕的?”
当有人在公司凶你时:别问"他为什么凶我",要问"他为什么敢" 目录 当有人在公司凶你时:别问"他为什么凶我",要问"他为什么敢" 别人敢在公司得罪你,是因为他早已算清了这笔账 他不怕得罪你,说明在他眼里你"没有威胁性" …...
全栈代码资源聚合库:开发者如何高效利用开源代码示例提升工程能力
1. 项目概述:一个面向开发者的全栈代码资源聚合库最近在GitHub上看到一个挺有意思的项目,叫wuwangzhang1216/claude-code-source-all-in-one。光看这个名字,你大概能猜到这是个什么——没错,这是一个围绕“代码”和“源代码”做文…...
ARM JTAG-DP调试端口架构与工程实践解析
1. ARM JTAG-DP调试端口架构解析JTAG调试端口(JTAG-DP)作为ARM CoreSight调试架构的核心组件,为芯片调试提供了标准化访问接口。其设计基于IEEE 1149.1标准,但针对调试场景进行了专门优化。在实际工程中,理解JTAG-DP的工作原理对嵌入式系统调…...
Beyond Compare 5本地化激活终极指南:三步实现专业文件对比工具永久使用
Beyond Compare 5本地化激活终极指南:三步实现专业文件对比工具永久使用 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen Beyond Compare作为专业的文件对比与合并工具,其…...
终端工作空间新选择:从 tmux 到 Zellij 的迁移与实战
1. 为什么需要从 tmux 迁移到 Zellij 作为一个用了五年 tmux 的老用户,我最初对 Zellij 这个"新玩具"是持怀疑态度的。直到有一次在远程服务器上调试时,tmux 的窗格突然卡死,所有工作进度瞬间归零,我才开始认真寻找替代…...
STM32F407 CCMRAM实战:释放LVGL图形库的RAM压力
1. 为什么需要CCMRAM优化LVGL性能 第一次用STM32F407做带屏项目时,我被RAM不足的问题折腾得够呛。当时用LVGL显示320x240的界面,刚加上第二个页面就频繁出现HardFault。用CubeMX生成的默认内存配置,128KB的RAM被各种变量瓜分后,留…...
AI开发环境一键构建:模块化脚本实现基础设施即代码
1. 项目概述:一个为AI工作流量身定制的开发环境构建器如果你和我一样,经常在本地机器、云服务器甚至多台设备之间切换,只为折腾不同的AI模型、跑通某个开源项目,那你一定对“环境配置”这四个字深恶痛绝。今天要聊的这个项目dabyd…...
3步掌握:如何用HTML转Figma工具实现网页设计稿快速转换
3步掌握:如何用HTML转Figma工具实现网页设计稿快速转换 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 你是否曾羡慕某个网站的布局设计,却苦于无法快速将…...
紧急预警:2024Q3起PlayAI将下线v2.1旧版翻译协议!迁移倒计时47天,5类遗留系统升级避坑手册
更多请点击: https://intelliparadigm.com 第一章:PlayAI多语种同步翻译功能详解 PlayAI 的多语种同步翻译功能基于端到端神经机器翻译(NMT)架构与实时语音流处理引擎深度融合,支持中、英、日、韩、法、西、德、俄等…...
