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…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...