news 2026/6/20 13:08:29

cmake_第二章 CMake基础语法_set(),缓存变量set(CACHE)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cmake_第二章 CMake基础语法_set(),缓存变量set(CACHE)

文章目录

  • 第二章 CMake基础语法
    • 2.4 cmake定义普通变量set()
      • 2.4.1 set() 语法格式
      • 2.4.2 变量类型和作用域详解
      • 2.4.3 CMake运行脚本 .cmake 文件
      • 2.4.4 编译 .cmake脚本-- cmake -P选项
      • 2.4.5 使用-D选项定义变量
      • 2.4.6 普通变量总结
    • 2.5 CMake定义缓存变量set(CACHE)
      • 2.5.1 缓存变量语法
      • 2.5.2 CMake变量类型
      • 2.5.3 CMake定义缓存变量
      • 2.5.4 CMake引用缓存变量
      • 2.5.5 探究CMakeCache.txt作用
      • 2.5.6 option() 命令

本文介绍cmake的普通变量set()和缓存变量set(CACHE)。

第二章 CMake基础语法

2.4 cmake定义普通变量set()

CMake中的变量分为普通变量和缓存变量,本节讲解普通变量。
CMake变量是 CMake 语言中的基本存储单元,变量的值是字符串类型。变量名称区分大小写,变量名称几乎可以包含任何文本,但建议使用仅由 “字母数字”加上“_”和“-”组成的名称。字母 数字 _ - 下划线和中划线。
CMake中使用set() 定义一个变量,下面开始逐步介绍set()的使用。

2.4.1 set() 语法格式

set语法格式如下:

set(<variable><value>...[PARENT_SCOPE])variable : 变量名,区分大小写 Value...: 变量值。如果提供多个只,多个变量之间以“;”分号分隔,多个变量组成LIst列表。如果未提供值,则该变量被取消设置。 PARENT SCOPE: 作用域设置,想在函数内部或子目录中修改变量,必须使用此标记。

作用域讲解:
1 目录作用域。当处理CMakeLists.txt时,会创建一个新的作用域。当执行上一节中的add_subdirectory时会进入子目录,子目录会复制父目录当前的变量副本,所以在子目录的CMakeLists.txt中修改变量,不影响父目录的变量。
2 函数作用域。当创建一个函数时,里边的变量是局部的。

2.4.2 变量类型和作用域详解

CMake中的变量分如下几类,下面分别介绍:
1 普通变量
这是最常见的变量.

set(var"Hello World")message("var =${var}")# var = Hello World# 设置多个值,定义时,多个值之间使用空格分隔。输出时,多个值之间用分号分隔set(multi_var"Value1""Value2""Value3")message("multi_var =${multi_var}")# multi_var = Value1;Value2;Value3set(multi_var_list VALUE_A VALUE_B VALUE_C)message("multi_var_list =${multi_var_list}")# multi_var_list = VALUE_A;VALUE_B;VALUE_C

2 PARENT_SCOPE作用域
如果在函数内部或者在子目录中修改父级目录的变量,必须使用此参数标记。

function(set_global_var)set(MY_GLOBAL67890PARENT_SCOPE)# 修改全局变量,需要加PARENT_SCOPEendfunction()set(MY_GLOBAL12345)set_global_var()message("Result:${MY_GLOBAL}")# 输出: Result: 67890

2.4.3 CMake运行脚本 .cmake 文件

在cmake中,如果只想打印,将变量写在.cmake脚本中,直接输出脚本文件中的变量。
构建时,使用cmake -P 选项直接运行CMake语法的脚本文件,而不执行任何项目配置(Configure)或生成(Generate)步骤,并且不修改缓存。在-P选项之前,我们还可以使用-D选项定义缓存变量。

cmake[-D 变量=]... -P<cmake-script-file>

测试源码:test.cmake

cmake_minimum_required(VERSION3.22)# 脚本文件中不能直接加 project#project(cmakescriptTest)# 定义变量: 变量名字区分大小写set(a"Hello CMake!")message(a=${a})#a=Hello CMake!# 大写变量名子, 变量名字没有加引号,变量值之间的空格被忽略set(A Hello CMake!)# HelloCMake!message("A=${A}")# A=Hello;CMake!

2.4.4 编译 .cmake脚本-- cmake -P选项

-P选项用于生成cmake脚本(.cmake文件),-P选项的全称是,script,理解为处理脚本(Process script),cmake -P xxx.cmake
使用 cmake -P选项只输出,而不进行编译。

可以看到,使用cmake文件,再使用-P选项只输出,而不进行编译。

2.4.5 使用-D选项定义变量

在cmake 编译时,使用-D(define)可自定义变量,然后在cmake文件中引用该变量。-D选项放在-P选项之前,理解为先定义再使用。

cmake_minimum_required(VERSION3.22)# 脚本文件中不能直接加 project#project(cmakescriptTest)# 定义变量: 变量名字区分大小写set(a"Hello CMake!")message(a=${a})#a=Hello CMake!# 大写变量名子, 变量名字没有加引号,变量值之间的空格被忽略set(A Hello CMake!)# HelloCMake!message("A=${A}")# A=Hello;CMake!# 输出-D 定义的变量message("Define=${Define}")

2.4.6 普通变量总结

可以使用set() 方法定义变量;变量命名区分大小写;cmake的变量总是字符串。
.cmake 结尾的脚本文件;
-D选项定义变量:可以在编译时,使用-D选项定义变量,然后在脚本文件中使用该变量,格式:变量名=“2222”

2.5 CMake定义缓存变量set(CACHE)

上一节讲了CMake中的普通变量,本节讲CMake中的缓存变量。
CMake缓存变量(或缓存条目)用于存储CMake的一些配置或由用户在cmake-gui界面上配置的选项,如禁用启用特定的功能、指定第三方库的路径等。
CMake首次执行时会进行配置,并在构建目录中创建CMakeCache.txt缓存文件来保存这些配置的值,缓存文件存在之后,CMake后续运行将直接使用,无需每次都让用户来配置一遍,除非手动修改或清除缓存!

2.5.1 缓存变量语法

使用set命令来设置缓存变量,语法如下.可以看到比普通变量定义时,多了一个“CACHE”关键字。

set(<variable><value>CACHE<type><docstring>[FORCE])variable:变量名 value:默认值 type:变量类型,如:(BOOL|FILEPATH|PATH|STRING|INTERNAL)docstring:变量描述,在GUI中显示。 FORCE:可选参数,强制更新已存在的缓存值,修改时不加FORCE选项则修改无效,<>是必选参数,[]可选参数。

2.5.2 CMake变量类型

BOOL 布尔值 ON/OFF,cmake-gui界面显示为一个复选框,
FILEPATH 磁盘上文件的路径,cmake-gui界面显示为一个文件对话框;
PATH 磁盘上目录的路径, cmake-gui界面显示为一个文件对话框。
STRING 字符串,cmake-gui界面显示为文本框或下拉选择(如果STRINGS缓存条目属性已设置)
INTERNAL 内部字符串,cmake-gui界面不显示任何内容。它们可用于跨运行持久存储变量。使用这种类型意味着FORCE;

2.5.3 CMake定义缓存变量

测试脚本仍然是test.cmake,在其中定义如下:

# 定义一个缓存变量set(MyCacheVar"2222"CACHE STRING"这是一个缓存变量")message("MyCacheVar=${MyCacheVar}")# 输出:MyCacheVar=2222# 另一种访问缓存变量的方式,使用 CACHE 关键字message("MyCacheVar=$CACHE{MyCacheVar}")#MyCacheVar=2222


强制修改缓存变量值:下面测试中可以发现,如果不加FORCE就不能修改缓存变量的值。

# 定义一个缓存变量set(MyCacheVar"2222"CACHE STRING"这是一个缓存变量")message("MyCacheVar=${MyCacheVar}")# 输出:MyCacheVar=2222# 另一种访问缓存变量的方式,使用 CACHE 关键字message("MyCacheVar=$CACHE{MyCacheVar}")#MyCacheVar=2222# 强制修改缓存变量的值,不加FORCEset(MyCacheVar"3333"CACHE STRING"这是一个缓存变量")message("MyCacheVar=${MyCacheVar}")# 输出:MyCacheVar=2222# 强制修改缓存变量的值,加FORCEset(MyCacheVar"4444"CACHE STRING"这是一个缓存变量"FORCE)message("MyCacheVar=${MyCacheVar}")# 输出:MyCacheVar=4444

2.5.4 CMake引用缓存变量

在CMakeLIsts.txt中,定义一个缓存变量,然后使用cmake-gui打开,查看缓存变量。

cmake_minimum_required(VERSION3.10)project(VariableExample)#1布尔类型缓存变量set(A1 ON CACHE BOOL"复选框")message(A1="$CACHE{A1}")# 输出 A1=ONmessage(A1=${A1})# 输出 A1=ON # #2文件类型缓存变量 CACHE FILEPATHset(A2"E:/practice_Code/cmake/14cache"CACHE FILEPATH"文件选择对话框")message(A2="$CACHE{A2}")# 输出 A2=E:/practice_Code/cmake/14cache # #3目录路径类型缓存变量 CACHE PATHset(A3"E:/practice_Code/cmake/14cache"CACHE PATH"目录选择对话框")message(A3="$CACHE{A3}")# 输出 A3=E:/practice_Code/cmake/14cache #4字符串类型缓存变量 CACHE STRINGset(A4"字符串1"CACHE STRING"字符串输入框")message(A4="$CACHE{A4}")# 输出 A4=字符串1set(A4"字符串2"CACHE STRING"字符串输入框")message(A4="$CACHE{A4}")# 输出 A4=字符串1# #5FORCE 强制设置缓存变量set(A4"字符串3"CACHE STRING"字符串输入框"FORCE)message(A4="$CACHE{A4}")# 输出 A4=字符串3


查看生成的缓存文件:

2.5.5 探究CMakeCache.txt作用

主要作用保存用户的配置选择和系统环境变量检测结果,一遍在后续的构建过程中重复使用,而无需每次都重新检测。
在之前,当运行 cmake -D A1=ON,这个 ON 的状态就被写入了 Cache 文件。下次只需运行 cmake …,CMake 会自动读取 Cache 中的 A1=ON,而不需要再次输入。
CMakeCache.txt 本质上是一个简单的存储键值对的文本数据库,存储格式为 变量名:类型=值。
用户交互接口:当使用 GUI 工具(如 cmake-gui)时,界面上显示的列表正是读取自这个文件。你在界面上修改的值,点击 “Configure” 后会写回这个文件。

2.5.6 option() 命令

使用option()命令来简化布尔类型缓存变量,语法如下:

option(<variable><help text>[value])

参数:

<variable>变量的名称<help text>描述文本 value 如果不提供此参数,则默认为OFF,如果variable普通变量或缓存变量已经存在,那么 此命令什么也不做。

# 6 使用option 定义 set(CACHE BOOL) 缓存变量option(A5"选项1"ON)# 等价于 : set(A5 ON CACHE BOOL "复选框")message(A5="$CACHE{A5}")# 输出 A5 = ON
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 16:27:01

HTTP 协议详解,HTTP 协议在真实运行环境中的表现差异

真正让我重新认真看 HTTP 协议&#xff0c;并不是在读 RFC 的时候&#xff0c;而是在一次接口问题排查中。 当时的问题并不复杂&#xff1a; 同一个接口&#xff0c;在不同网络环境下返回结果不一致&#xff1b;有时状态码正常&#xff0c;但客户端行为异常&#xff1b;有时服务…

作者头像 李华
网站建设 2026/6/16 3:13:17

【Hadoop+Spark+python毕设】天猫订单交易数据可视化分析系统、计算机毕业设计、包括数据爬取、数据分析、数据可视化、实战教学

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

作者头像 李华
网站建设 2026/6/20 1:39:32

python-flask-django基于Web的在线考试答题游戏的设计与实现_5o5sjig8

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 python-flask-django基于Web的在线考试答题游戏的设计与实现_5o5sjig8 项目技术简介 Pyth…

作者头像 李华
网站建设 2026/6/18 13:10:01

免费彻底解决找不到d3dx10_38.dll文件 无法运行软件和游戏问题

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/12 2:16:36

Mac_Linux 查询网站IP地址:4个核心命令详解

Mac/Linux 查询网站IP地址&#xff1a;4个核心命令详解 在日常开发、网络排查或学习过程中&#xff0c;我们经常需要知道某个网站对应的IP地址&#xff08;比如确认域名解析是否正常、判断访问延迟的原因等&#xff09;。在Mac和Linux系统下&#xff0c;无需安装额外工具&#…

作者头像 李华
网站建设 2026/6/16 3:10:09

ArcGIS大师之路500技---034重采样算法选择

文章目录前言1. 最邻近分配法&#xff08;Nearest Neighbor Assignment&#xff09;2. 双线性插值法&#xff08;Bilinear Interpolation&#xff09;3. 三次卷积插值法&#xff08;Cubic Convolution Interpolation&#xff09;4. 众数重采样法&#xff08;Mode Resampling / …

作者头像 李华