当前位置: 首页 > news >正文

cmake CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR的区别

在 CMake 中,CMAKE_CURRENT_LIST_DIRCMAKE_CURRENT_SOURCE_DIR 都是指代当前 CMake 文件所在的路径,但它们的含义和用途有所不同:

  1. CMAKE_CURRENT_LIST_DIR

    • 表示 当前处理的 CMake 文件(例如 CMakeLists.txt)所在的目录路径。
    • 这个变量的值是相对当前 CMake 文件的位置。如果你的 CMake 文件包含其他的子目录或 include() 语句,它将为每一个被处理的 CMake 文件指向不同的路径。
    • 用法场景:当你需要知道某个特定 CMake 文件的位置时使用,尤其是当项目中有多个 CMake 文件或模块时。

    例如:

    message("Current CMake file directory: ${CMAKE_CURRENT_LIST_DIR}")
    
  2. 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,它会返回你整个项目的根目录路径,也就是包含 srcCMakeLists.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 的两个变量

  1. CMAKE_CURRENT_SOURCE_DIR

    • 这个变量指的是 CMake 正在处理的 CMake 文件所在的目录
    • 如果你在 my_project/src/CMakeLists.txt 里用这个变量,它返回的就是 my_project/(根目录),因为你在根目录下运行 cmake
  2. 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

你说得对,我最后的描述有些不准确,感谢你指出来!让我来纠正一下:

正确的解释:

  1. CMAKE_CURRENT_SOURCE_DIR

    • 意思:它指的是 当前 CMake 处理的源代码目录,即你在运行 cmake 命令时指定的那个目录。这个目录通常是项目的根目录,或者是某个子目录(如果你在子目录里运行了 cmake)。
    • 举个例子:如果你在 my_project/(整个项目的根目录)运行 cmakeCMAKE_CURRENT_SOURCE_DIR 就会是 my_project/,即源代码的根目录。
  2. 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_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)一起使用。 用法: 打包文件&#xff0…...

目标跟踪算法: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算法)

深度优先搜索的利用。 在一个无向连通图中,如果删掉某个顶点后,图不再连通(即任意两点之间不能互相到达),我们称这样的顶点为割点。 在一个无向连通图中,如果删掉某条边后,图不在连通&#xff0…...

算法学习(十四)—— 二叉树的深度搜索(DFS)

目录 关于dfs 部分OJ题详解 2331. 计算布尔二叉树的值 129. 求根节点到叶节点数字之和 814. 二叉树剪枝 98. 验证二叉搜索树 230. 二叉搜索树中第K小的元素 257. 二叉树的所有路径 关于dfs 算法学习(十二)—— 递归,搜索&#xff0c…...

【vue2】封装自定义的日历组件(三)之基础添加月份的加减定位到最新月份的第一天

我们在切换月份的时候,希望高亮显示在每个月的第一天上面,这样的效果我们要怎么来实现,其实也很简单,我们先看下实现的效果 实现效果 代码实现 原理就是获取到每月的第一天日期,然后再跟整个的数据进行对比&#xff…...

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 方法注入&#xf…...

开源向量数据库介绍说明

开源向量数据库 Milvus 特点:分布式、高性能,支持亿级向量检索。 支持的数据类型:文本、图像、音频、视频等。 使用场景:推荐系统、语义搜索、图像搜索。 数据存储后端:支持多种后端,如 SQLite、MySQL、Pos…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...