CMakeLists.txt语法规则:提供信息的变量说明一

一. 简介

前面几篇文章学习了 CMakeLists.txt语法中 部分常用命令。

接下来学习CMakeLists.txt语法中部分常用变量,变量也是 cmake 中的一个重头戏,cmake 提供了很多内置变量。每一个变量都有它自己的含义,可以通过如下链接地址查询到所有的内置变量及其相应的介绍:

复制代码
https://cmake.org/cmake/help/v3.16/manual/cmake-variables.7.html

在这一份文档中,对变量进行分类。变量分为:提供信息的变量、改变行为的变量、描述系统的变量、控制编译的变量等等。

二. CMakeLists.txt语法规则:部分常用变量

1. 提供信息的变量

顾名思义,这种变量可以提供某种信息,既然如此,那么我们通常只需要读取变量即可,而不需要对变量进行修改:

|--------------------------|----------------------------------------------------------|
| ##### 变量 | ##### 说明 |
| PROJECT_SOURCE_DIR | 工程顶层目录,也就是顶层 CMakeLists.txt 源码所在目录 |
| PROJECT_BINARY_DIR | 工 程 BINARY_DIR , 也 就 是 顶 层 CMakeLists.txt 源码的 BINARY_DIR |
| CMAKE_SOURCE_DIR | 与 PROJECT_SOURCE_DIR 等价 |
| CMAKE_BINARY_DIR | 与 PROJECT_BINARY_DIR 等价 |
| CMAKE_CURRENT_SOURCE_DIR | 当前源码所在路径 |
| CMAKE_CURRENT_BINARY_DIR | 当前源码的 BINARY_DIR |
| CMAKE_MAJOR_VERSION | cmake 的主版本号 |
| CMAKE_MINOR_VERSION | cmake 的次版本号 |
| CMAKE_VERSION | cmake 的版本号(主+次+修订) |
| PROJECT_VERSION_MAJOR | 工程的主版本号 |
| PROJECT_VERSION_MINOR | 工程的次版本号 |
| PROJECT_VERSION | 工程的版本号 |
| CMAKE_PROJECT_NAME | 工程的名字 |
| PROJECT_NAME | 工程名,与 CMAKE_PROJECT_NAME 等价 |

2. PROJECT_SOURCE_DIR变量 和 PROJECT_BINARY_DIR 变量

PROJECT_SOURCE_DIR 变量表示工程的顶级目录,也就是顶层 CMakeLists.txt 文件所在目录;
PROJECT_BINARY_DIR 变 量 表示 工程 的 BINARY_DIR ,也 就是 顶 层 CMakeLists.txt 源 码 对 应的 BINARY_DIR (输出文件目录)。
譬如工程目录结构如下所示:

CMakeLists.txt 文件内容如下:

复制代码
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.16")
project(HELLO)
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})

CMakeLists.txt 中,我们打印了 PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 变量,进入到 build 目录下,执行 cmake :

从打印信息可知, PROJECT_SOURCE_DIR 指的就是工程的顶层 CMakeLists.txt 源码所在路径,而 PROJECT_BINARY_DIR 指的是我们执行 cmake 命令的所在目录。

3. CMAKE_SOURCE_DIR 和 CMAKE_BINARY_DIR

与上面两个等价,大家自己打印出来看看便知!
向 顶层 CMakeLists.txt 添加打印命令:

复制代码
message(${CMAKE_SOURCE_DIR})
message(${CMAKE_BINARY_DIR})

进入 build目录下,执行 cmake ..命令后如下:

可以看出,与 PROJECT_SOURCE_DIR,PROJECT_BINARY_DIR一样的目录。

相关推荐
Yana.nice8 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
DFT计算杂谈11 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
Zhang~Ling12 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind13 小时前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock
爱写代码的森13 小时前
蒙三方库 | harmony-utils之FileUtil文件重命名与属性查询详解
linux·运维·服务器·华为·harmonyos·鸿蒙·huawei
XMAIPC_Robot14 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
重生的黑客14 小时前
Linux 进程优先级、切换与调度:从孤儿进程到 O(1) 调度模型
linux·运维·服务器·进程优先级·nice
骑上单车去旅行16 小时前
MD5校验对比脚本
linux·服务器·windows
平生幻16 小时前
Linux 常用命令
linux
ShirleyWang01217 小时前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s