CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比

CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比

—— 杭州 2024-03-19 夜

在这里插入图片描述

code review!

文章目录

  • CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比
    • 1.三者区别
    • 2.具体示例说明
    • 3.CMAKE_SOURCE_DIR 和 PROJECT_SOURCE_DIR的区别

1.三者区别

下面是一个表格,简要总结了 CMAKE_CURRENT_BINARY_DIRCMAKE_SOURCE_DIRPROJECT_SOURCE_DIR 的区别:

变量描述
CMAKE_CURRENT_BINARY_DIR指向当前处理的 CMakeLists.txt 文件对应的构建目录。对于多级目录结构的项目,每个目录的这个变量指向的都是它自己的构建目录。
CMAKE_SOURCE_DIR指向最顶层 CMakeLists.txt 文件的源码目录,即整个项目的根源码目录。在所有的 CMakeLists.txt 文件中保持不变,无论它们在源码树的何处。
PROJECT_SOURCE_DIR指向最近通过 project() 命令定义的项目的根源码目录。如果是单个项目,则与 CMAKE_SOURCE_DIR 相同。在使用 add_subdirectory 命令嵌套项目时,对于每个子项目来说,它指向的是各自的根源码目录。

这些变量在不同的 CMakeLists.txt 文件中的行为会有所不同,特别是在含有多个子项目的情况下。例如,在一个包含子项目的构建系统中:

root_project/           # 根项目目录
|- CMakeLists.txt       # 根项目 CMakeLists.txt, 包含 project(RootProject)
|- sub_project/         # 子项目目录|- CMakeLists.txt    # 子项目 CMakeLists.txt, 包含 project(SubProject)

假设我们在 root_project/build 目录中执行构建命令,每个 CMakeLists.txt 文件中变量的值将如下:

文件CMAKE_CURRENT_BINARY_DIRCMAKE_SOURCE_DIRPROJECT_SOURCE_DIR
root_project/CMakeLists.txtroot_project/buildroot_projectroot_project
sub_project/CMakeLists.txtroot_project/build/sub_projectroot_projectsub_project

在这个例子中,CMAKE_SOURCE_DIR 在所有的 CMakeLists.txt 文件中都是相同的,因为它指向最顶层 CMakeLists.txt 文件的目录。而 PROJECT_SOURCE_DIR 在子项目的 CMakeLists.txt 中指向的是子项目的源码目录,因为 project() 命令在那里被调用。而 CMAKE_CURRENT_BINARY_DIR 则对应于每个 CMakeLists.txt 文件的当前构建目录。

2.具体示例说明

让我们假设你有一个项目的文件组织结构如下所示:

/my_project
|-- CMakeLists.txt
|-- src
|   |-- CMakeLists.txt
|   |-- main.cpp
|-- lib|-- utils|-- CMakeLists.txt|-- util.cpp

在这个结构中:

  • /my_project 是项目的根目录。
  • /my_project/src 包含项目的主要源文件。
  • /my_project/lib/utils 包含项目的一些实用工具函数。

现在,我们将看看如何在不同的 CMakeLists.txt 文件中使用这些变量:

  1. /my_project/CMakeLists.txt (顶层 CMakeLists.txt):
cmake_minimum_required(VERSION 3.0)
project(MyProject)add_subdirectory(src)
add_subdirectory(lib/utils)# CMAKE_SOURCE_DIR 在这里指向 /my_project
# PROJECT_SOURCE_DIR 在这里指向 /my_project
# CMAKE_CURRENT_BINARY_DIR 在这里指向 /my_project/build (假设在 /my_project/build 目录中运行 cmake ..)
  1. /my_project/src/CMakeLists.txt:
# 这个文件是 src 目录的 CMakeLists.txt# CMAKE_SOURCE_DIR 这里仍然指向 /my_project
# PROJECT_SOURCE_DIR 这里仍然指向 /my_project
# CMAKE_CURRENT_BINARY_DIR 在这里指向 /my_project/build/src
# (假设在 /my_project/build 目录中运行 cmake ..)
  1. /my_project/lib/utils/CMakeLists.txt:
# 这个文件是 lib/utils 目录的 CMakeLists.txt# CMAKE_SOURCE_DIR 这里仍然指向 /my_project
# PROJECT_SOURCE_DIR 这里仍然指向 /my_project
# CMAKE_CURRENT_BINARY_DIR 在这里指向 /my_project/build/lib/utils
# (假设在 /my_project/build 目录中运行 cmake ..)

如果你在 /my_project/build 目录中运行 cmake .. 命令来构建你的项目,CMake 会创建相应的构建文件在该 build 目录中。在这种情况下:

  • CMAKE_CURRENT_BINARY_DIR 对于每个 CMakeLists.txt 文件,都指向其对应的在构建目录树中的位置,而不是源码目录树。
  • CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR 在所有的 CMakeLists.txt 文件中始终指向项目的顶层源码目录 /my_project

这样,无论你在项目的哪个子目录中工作,你都可以使用这些变量来引用项目中的其他文件或目录,而不必担心相对路径的问题。

3.CMAKE_SOURCE_DIR 和 PROJECT_SOURCE_DIR的区别

在 CMake 中,CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR 确实有细微的区别,尤其是在涉及多项目(例如,使用add_subdirectory,或者在超级构建中)的情况下。这里是它们的具体区别:

  • CMAKE_SOURCE_DIR 指向最顶层 CMakeLists.txt 文件的目录,这个目录是整个构建树的根源码目录。不管你在哪个子目录中调用 CMAKE_SOURCE_DIR,它始终指向顶层 CMakeLists.txt 所在的目录。在单项目构建中,CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR 是相同的。

  • PROJECT_SOURCE_DIR 指向最近一次调用 project() 命令的目录。如果你在一个子目录中有另一个 project() 命令(表示该子目录是一个独立的项目),那么在该子目录及其下级目录中,PROJECT_SOURCE_DIR 会指向这个子项目的根源码目录,而不是整个构建树的根源码目录。

这里是一个例子来说明这一点:

假设你有以下目录结构:

/my_super_project
|-- CMakeLists.txt         # contains 'project(SuperProject)'
|-- subproject_a
|   |-- CMakeLists.txt     # contains 'project(ProjectA)'
|-- subproject_b|-- CMakeLists.txt     # does not contain 'project()' command

这里是每个目录中这些变量的值:

  • /my_super_project/CMakeLists.txt 中:

    • CMAKE_SOURCE_DIR = /my_super_project
    • PROJECT_SOURCE_DIR = /my_super_project
  • /my_super_project/subproject_a/CMakeLists.txt 中:

    • CMAKE_SOURCE_DIR = /my_super_project
    • PROJECT_SOURCE_DIR = /my_super_project/subproject_a
  • /my_super_project/subproject_b/CMakeLists.txt 中(没有 project() 命令):

    • CMAKE_SOURCE_DIR = /my_super_project
    • PROJECT_SOURCE_DIR = /my_super_project (因为 subproject_b 没有自己的 project() 命令,所以它继承了顶层项目的 PROJECT_SOURCE_DIR)

正因为这样的行为,PROJECT_SOURCE_DIR 在处理复杂项目结构时非常有用,尤其是当你需要引用当前项目的根源码目录时。这样,即使在多个子项目的设置中,每个子项目也可以有自己的根源码目录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sora没体验资格?开源项目:Open-Sora,复现类Sora视频生成方案

项目简介 Open-Sora项目是一项高效制作高质量视频的工作,明确所有权使用其模型、工具和内容的计划。通过采用开源原则,Open-Sora 不仅实现了先进的视频生成技术的普及,还提供了一个专业且用户界面的方案,简化了视频制作的复杂性。…

php 对接Pangle海外广告平台收益接口Reporting API

今天对接的是Pangle广告reporting api接口,拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Pangle后台就能看到文档地址以及参数: 文档地址:https://www.pangleglobal.com/zh/integration/reporting-api-v2 在这里插入图片…

算法---二分查找练习-2(寻找旋转排序数组中的最小值)

寻找旋转排序数组中的最小值 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:点这里 2. 讲解算法原理 首先,检查数组的最后一个元素是否大于第一个元素。如果是,说明数组没有进行旋转,直接返回第一个元素作为最小值…

稀碎从零算法笔记Day22-LeetCode:

题型:链表 链接:2. 两数相加 - 力扣(LeetCode) 来源:Leet 题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 …

vue项目:使用xlsx导出Excel数据

文章目录 一、安装xlsx二、报错及解决三、编写公共方法四、方法使用 一、安装xlsx 执行命令:npm i xlsx file-saver --save 二、报错及解决 使用时:import XLSX from "xlsx"; 发现如下报错信息 报错原因:xlsx版本不兼容。 解…

Java项目基于SpringBoot和Vue的时装购物系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的时装购物系统。 💕💕作者:李同学 💕💕个人简介:混迹在java圈十年有余,擅长Java、微信小程序、Python、Android等,大家有这一块的问题可…

web前端之不一样的下拉菜单、不选中第一个元素的样式效果、伪类排除第一个元素、符号选择器、hover、not、first、child

MENU 效果图htmlcssJShtmlcss 效果图 htmlcssJS html <nav><ul><li class"navli"><h4>HTML5</h4><ul class"ulson"><li class"lison">HTML5</li></ul></li><li class"na…

Django单表数据库操作

单表操作 测试脚本 当你只想测试django某一个py文件的内容,可以不用书写前后端的交互,直接写一个测试脚本即可 单表删除 数据库操作方法: 1.all():查询所有的数据 2.filter():带有过滤条件的查询 3.get():直接拿数据对象,不存在则报错 4.first():拿queryset里面的第一个元素…

天童知识课堂|“春分”

春色正中分&#xff0c;人间恰良辰。春分&#xff0c;也称升分&#xff0c;是二十四节气之一。春分的到来&#xff0c;意味着春天已经过去一半了&#xff0c;气候也逐渐温暖&#xff0c;阳光更加明媚。而关于春分的知识&#xff0c;你知道多少呢&#xff1f;来和天童美语一起了…

鸿蒙开发实战:【系统服务管理部件】

简介 samgr组件是OpenHarmony的核心组件&#xff0c;提供OpenHarmony系统服务启动、注册、查询等功能。 系统架构 图 1 系统服务管理系统架构图 目录 /foundation/systemabilitymgr ├── samgr │ ├── bundle.json # 部件描述及编译文件 │ ├── frameworks …

vue+elementui中table实现单选行功能

el-table插件可以选择行&#xff0c;但是只能多选&#xff0c;而项目中有单选的需求。 效果如下图所示&#xff0c;点击行或者点击复选框都可以选中行&#xff08;高亮&#xff0c;复选框选中&#xff09;&#xff0c;并且每次只选中当前行&#xff0c;之前选中的行清空。点击标…

Elasticsearch:让你的 Elasticsearch 索引与 Python 和 Google Cloud Platform 功能保持同步

作者&#xff1a;来自 Elastic Garson Elasticsearch 内的索引 (index) 是你可以将数据存储在文档中的位置。 在使用索引时&#xff0c;如果你使用的是动态数据集&#xff0c;数据可能会很快变旧。 为了避免此问题&#xff0c;你可以创建一个 Python 脚本来更新索引&#xff0…

端口如何映射到外网?

在现代信息化社会中&#xff0c;远程访问已经成为人们工作和生活中不可或缺的一部分。复杂的网络环境和网络限制可能会给远程连接带来不便。在这种情况下&#xff0c;端口映射到外网的技术应运而生。本文将介绍端口映射到外网的概念、应用场景以及一种优秀的解决方案——【天联…

Docker-安装

Docker ⛅Docker-安装&#x1f320;各平台支持情况&#x1f320;Server 版本安装☃️Ubuntu☃️Centos &#x1f320;Docker 镜像源修改&#x1f320;Docker 目录修改 ⛅Docker-安装 &#x1f320;各平台支持情况 &#x1f320;Server 版本安装 ☃️Ubuntu &#x1f342;安装…

LiveGBS流媒体平台GB/T28181功能-HTTPS 服务支持配置开启什么时候需要开启HTTPS测试SSL证书配置HTTPS测试证书

LiveGBS功能支持HTTPS 服务支持配置开启什么时候需要开启HTTPS测试SSL证书配置HTTPS测试证书 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 LiveCMS 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、HTTPS测试证书3、验证HTTPS服务4、为什么要…

Visual Studio 2013 - 清理

Visual Studio 2013 - 清理 1. 清理1.1. 工程清理1.2. 解决方案清理 References 1. 清理 Debug Release 1.1. 工程清理 (right mouse click on the project) -> 清理 1.2. 解决方案清理 (right mouse click on the solution) -> 清理解决方案 References [1] Yongq…

Vue技能树总结01

Vue vs React 相似之处: 它们都有使用 Virtual DOM&#xff1b;提供了响应式&#xff08;Reactive&#xff09;和组件化&#xff08;Composable&#xff09;的视图组件。将注意力集中保持在核心库&#xff0c;而将其他功能如路由和全局状态管理交给相关的库。React 比 Vue 有更…

记录C++中,子类同名属性并不能完全覆盖父类属性的问题

问题代码&#xff1a; 首先看一段代码&#xff1a;很简单&#xff0c;就是BBB继承自AAA&#xff0c;然后BBB重写定义了同名属性&#xff0c;然后调用父类AAA的打印函数&#xff1a; #include <iostream> using namespace std;class AAA { public:AAA() {}~AAA() {}void …

网络货运平台有哪些

网络货运平台有运满满、货拉拉、快狗打车、滴滴货运、货运宝、G7、货骑士、云鸟配送、积微物联、中储智运等。 运满满 运满满创立于2013年&#xff0c;是国内首家基于云计算、大数据、移动互联网和人工智能技术开发的货运调度平台&#xff0c;是公路物流领域高新技术综合应用…

线性代数基础概念和在AI中的应用

基本概念 线性代数是数学的一个分支&#xff0c;专注于向量、向量空间&#xff08;也称为线性空间&#xff09;、线性变换和矩阵的研究。这些概念在数据科学、人工智能、工程学和物理学等多个领域都有广泛应用。以下是这些基本概念的详细解释和它们在数据处理和AI中的应用。 …