cmake项目相关的变量

news2025/1/17 21:46:33

cmake项目相关的变量

在cmake项目中,通常需要对路径进行操作,比如我们需要知道源码的顶级目录,源码的构建目录和某个project名字相关的一些目录等。

CMAKE_SOURCE_DIR,这个变量的值代表的是源码的顶级目录。但是这个变量的值可能会发生变化。

比如我们现在有个项目B,他的顶级目录是/root/workspace/code/b。这时候我们在项目B中使用CMAKE_SOURCE_DIR变量的值,毫无疑问,它的值是:/root/workspace/code/b

现在我们又有一个项目A,它的顶级目录是/root/workspace/code/a,同时我们的项目A依赖项目B,所以我们通过某种方式将项目B作为项目A的依赖。假设这个时候项目A依赖的项目B的源码在/root/workspace/code/b/3rd/b目录中。那这个时候我们在项目B中获取到的CMAKE_SOURCE_DIR的值就不是我们期望的/root/workspace/code/a/3rd/b,而变成了/root/workspace/code/a。所以我们的项目如果可能被作为第三方项目使用,那CMAKE_SOURCE_DIR的值可能是不可靠的。

同样CMAKE_BINARY_DIR变量同样有这样的问题。

那cmake是怎么解决这些问题的了?当我们调用project()命令的时候cmake会同时设置一些和project相关的变量的值。

  • PROJECT_SOURCE_DIR
    • 该变量的值是在当前作用域或者父作用域中最近的一处调用project()命令的那个CMakeLists.txt所在的目录。
  • PROJECT_BINARY_DIR
    • PROJECT_SOURCE_DIR 目录对应的构建目录。
  • projectName_SOURCE_DIR
    • 前面的projectName是在调用project()命令时传入的名字,加上——SOURCE_DIR后缀可以特指某个项目的CMakeLists.txt所在的目录。
  • projectName_BINARY_DIR
    • projectName_SOURCE_DIR 目录对应的构建目录

demo

目录结构:

顶层目录下,有一个child文件夹,child文件夹有个grandchild文件夹

top cmake文件:

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

project(topLevel)

message("Top level : \n")
message("  PROJECT_SOURCE_DIR  = ${PROJECT_SOURCE_DIR}")
message("  topLevel_SOURCE_DIR = ${topLevel_SOURCE_DIR}")

add_subdirectory(child)

 child cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

message("Child \n")
message("  PROJECT_SOURCE_DIR (before)  = ${PROJECT_SOURCE_DIR}")
project(child)
message("  PROJECT_SOURCE_DIR (after)  = ${PROJECT_SOURCE_DIR}")
message("  child_SOURCE_DIR = ${child_SOURCE_DIR}")

add_subdirectory(grandchild)

grandchild cmake文件

cmake_minimum_required(VERSION 3.26 FATAL_ERROR)

message("GrandChild \n")
message("  PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}")
message("  child_SOURCE_DIR  = ${child_SOURCE_DIR}")
message("  topLevel_SOURCE_DIR = ${topLevel_SOURCE_DIR}")

结果:

  总结:

通过上面的例子,我们可以看到,使用project()命令相关的变量去获取相关的路径是非常可靠的,我们的项目中也建议使用这种方式.

举个例子,我们再使用${CMAKE_SOURCE_DIR}/someFile的时候最好使用${PROJECT_SOURCE_DIR}/someFile 或者${projctName_SOURCE_DIR}/someFile代替.这样无论我们的项目是单独构建的还是作为一个子项目构建都能保证我们期望的目录是对的.我们经常看到一些开源项目的顶级目录的CMakeLists.txt中有类似下面的代码:

if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
    # do something
endif()

这里通过比较CMAKE_CURRENT_SOURCE和CMAKE_SOURCE_DIR两个变量的值来判断当前项目是否单独构建.如果相等,表明这个项目是单独构建的,没有作为任何其他项目的子模块.

上面这种方式还需要我们自己判断,cmake3.21版本开始,cmake提供了一个变量:PROJECT_IS_TOP_LEVEL,如果这个变量为真,就代表当前项目是单独构建的,或者是项目中顶级project.

同理,也有proName_IS_TOP_LEVEL变量.每当我们调用project()命令的时候,就会创建对应的proName_IS_TOP_LEVEL缓存变量.

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

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

相关文章

Python(十一)变量多次赋值

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【hadoop】部署hadoop的本地模式

hadoop的本地模式 本地模式的特点部署本地模式测试本地模式是否部署完成 本地模式的特点 没有HDFS、也没有Yarn只能测试MapReduce程序,作为一个普通的Java程序处理的数据是本地Linux的文件一般用于开发和测试 部署本地模式 进入该路径 /root/training/hadoop-2.7…

吴恩达机器学习2022-Jupyter

1 可选实验室: Python、 NumPy 和矢量化 简要介绍本课程中使用的一些科学计算。特别是 NumPy 科学计算包及其与 python 的使用。 2 目标 在这个实验室里将回顾课程中使用的 NumPy 和 Python 的特性。 Python 是本课程中使用的编程语言。NumPy 库扩展了 python 的基本功能&a…

mac 如何批量修改图片名称

mac 如何批量修改图片名称?很多使用mac电脑的小伙伴一直有这样一个疑问,怎么在电脑上一次性的批量修改大量图片的名称,很多小伙伴在电脑上整理图片的时候都需要批量重命名,批量处理的功能可以让我们节省不少的时间和精力&#xff…

抖音seo怎么选择关键词

要查找抖音的关键词,以进行SEO优化,可以按照以下步骤进行: 1. 关键词分析与筛选: 首先,你需要确定你的目标受众和内容类型。了解你的目标用户是谁,他们可能会搜索什么样的内容。然后,使用关键…

虾皮一面:手写一个Strategy模式(策略模式)

说在前面 在40岁老架构师 尼恩的读者交流区(50)中,最近有指导一个小伙伴面试架构师,面试的公司包括虾皮、希音、美团等大厂,目标薪酬50K以上,遇到了一个比较初级的问题: 请手写一个Strategy模式(策略模式…

基于物联网技术的养老院管理系统设计与实现_kai

基于物联网技术的养老院管理系统设计与 实现 摘 要 随着我国老年人口数量的逐年增加,人口抚养比也在迅速攀升,越来越多的老年人将走 出家门进入养老院安度自己的晚年。同时国家和地方也相继出台了加快发展老龄事业的政策 方针,作为机构养老…

Shell之循环语句 —— For 实验

循环 循环就是重复执行一段代码的结构,通过循环可在满足一定的条件下,多次执行相同的代码。 循环语句:循环体 —— 代码的总结构 循环条件 —— 当循环条件满足时,循环体代码才会被执行,否则条件不满足…

SpringCloud Alibaba——Nacos中的Distro协议

一、Nacos中的Distro协议 Nacos 每个节点自己负责部分的写请求。每个节点会把自己负责的新增数据同步给其他节点。每个节点定时发送自己负责数据的校验值到其他节点来保持数据一致性每个节点独立处理读请求,及时从本地发出响应。新加入的 Distro 节点会进行全量数据…

【高并发网络通信架构】3.引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

目录 一,往期文章 二,基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select,poll,epoll 三者对比 三,函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_cre…

前端uni-app自定义精美全端复制文本插件,支持全端文本复制插件 可设置复制按钮颜色

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现…

读数据压缩入门笔记07_自适应统计编码

1. 位置对熵的重要性 1.1. 为了计算概率总需要多遍历一次数据集,而在计算出整个数据集中各符号的出现概率后,还要继续处理这些数值 1.1.1. 如果是相对较小的数据集,那么这些就不是什么问题 1.2. 随着要压缩的数据集变大,统计编…

Python异常值检测——案例分析

目录 1.单个变量异常值检测 2. 双变量关系中的异常值检测 3. 使用线性回归来确定具有重大影响的数据点 4. 使用k最近邻算法找到离群值 5. 使用隔离森林算法查找异常 1.单个变量异常值检测 如果某个值离平均值有多个标准偏差,并且远离近似标准正态分布的值&#…

Office如何通过VSTO进行WORD插件开发?

文章目录 0.引言1.工具准备2.WORD外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO(Visual Studio Tools for Office )是VBA的替代,是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展…

在 3ds max 中创建逼真的镜像材质

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 选项 1.平面镜面材料 步骤 1 首先,我们需要包含镜像对象和一个或多个镜像对象的场景。您可以在此处下载本教程中使用的场景,也可以使用您自己的场景和对象。对于第一个镜像选项&…

Unreal Engine 与 Blender - 比较指南

虚幻引擎和 Blender 是游戏开发人员中最常用的两种软件,它们在游戏开发工作流程中都有自己的用途和地位。作为进入视频游戏行业的初学者,可能很难从数十种软件中筛选找到最适合您需求的一款。希望本指南能够缓解这一困难并帮助您决定选择哪个软件。 虚幻…

【c++源码】瑞佳飞飞彩虹端分享老飞飞源码

里面功能包含。离线摆摊,内挂,宠物系统,宠物进阶,任意商店,回收装备,模型查看,个人排行榜,物品分解,全物品升级,钥匙开箱子,外观变更,…

电商数据采集方式有哪些

不管是做渠道管控、还是价格监测,数据采集都是基础,只有数据准确了,品牌才能更好的管控乱价、治理渠道。同时当品牌有数据分析需求时,对数据采集的要求也会越高。 力维网络有自主开发的数据采集监测系统,可为品牌提供多…

SpringCloud整合Sentinel

文章目录 1、Sentinel介绍2、安装Sentinel控制台3、微服务整合Sentinel 1、Sentinel介绍 阿里开源的流量控制组件官网:https://sentinelguard.io/zh-cn/index.html承接了阿里双十一大促流量的核心场景,如秒杀、消息削峰填谷、集群流量控制、实时熔断下游…

关于Java的网络编程

网络的一些了解 网络通信协议 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组&…