CMake入门教程【核心篇】变量的作用域

在这里插入图片描述

😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「本文的内容」CMake入门教程
😈「动动你的小手」点赞👍收藏⭐️评论📝


文章目录

  • 1. CMake变量的类型
  • 2. 变量的作用域
    • 2.1 普通变量
    • 2.2 缓存变量
  • 3. 变量覆盖
  • 4. 函数和宏的作用域
  • 5. 传递变量
  • 6. 推荐做法

CMake中理解变量的作用域对于编写有效和可维护的CMake脚本至关重要。本教程将深入探讨CMake中变量的作用域及其使用。

CMake变量作用域
普通变量
缓存变量
变量覆盖
函数和宏作用域
传递变量
推荐做法
局部于定义目录和子目录
项目范围内全局可见
子目录更改不影响父目录
仅在函数或宏内有效
通过函数参数传递
使用局部变量和明确的缓存变量

CMake_34">1. CMake变量的类型

CMake主要处理两种类型的变量:

  • 普通变量:在CMake脚本执行期间设置和访问。
  • 缓存变量:长期存在,即使在CMake配置结束后也会被保存。

2. 变量的作用域

CMake中,变量的作用域是由其定义的上下文决定的:

2.1 普通变量

普通变量的作用域通常局限于其被定义的目录和子目录。当在CMakeLists.txt文件或包含的文件(通过include命令)中设置变量时,这些变量仅在当前处理的CMake目录及其子目录中可见。

cmakeCopy code
set(MY_VAR "Hello") # 在当前目录和子目录中可见

2.2 缓存变量

缓存变量在整个项目范围内可见,可以跨多次CMake配置运行保持其值。通过set()命令并使用CACHE选项创建缓存变量:

cmakeCopy code
set(MY_CACHE_VAR "World" CACHE STRING "A cache variable")

3. 变量覆盖

在子目录中对变量进行修改不会影响父目录中的同名变量。每个目录可以有自己的变量版本,子目录中的变量更改仅在该子目录及其子目录中有效。

4. 函数和宏的作用域

在函数或宏内部设置的变量仅在该函数或宏的作用域内有效。调用函数或宏时,它们无法修改父作用域中的变量,除非使用PARENT_SCOPE选项。

function(my_function)
    set(MY_VAR "Local" PARENT_SCOPE)
endfunction()

5. 传递变量

可以通过函数参数将变量从一个作用域传递到另一个作用域。

function(print_var VAR)
    message("${VAR}")
endfunction()

set(MY_VAR "Hello World")
print_var(${MY_VAR})

6. 推荐做法

为了避免混淆和潜在的错误,建议:

  • 在可能的情况下使用局部变量。
  • 明确指定和使用缓存变量。
  • 尽量避免在子目录或函数内部更改父作用域的变量。

理解并正确使用变量的作用域有助于提高CMake脚本的可读性和可维护性。通过遵循这些指导原则,您可以确保CMake项目的配置逻辑清晰且易于管理。


http://www.niftyadmin.cn/n/5301373.html

相关文章

el-select下拉框 change事件返回该项所有数据

主要代码 value-key <template><div><el-selectv-model"value"value-key"label"placeholder"请选择"change"selectChange"><el-optionv-for"item in options":key"item.label":label"…

IPC之十二:使用libdbus在D-Bus上异步发送/接收信号的实例

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;本 IPC 系列文章的前十篇介绍了几乎所有的常用的 IPC 方法&#xff0c;每种方法都给出了具体实例&#xff0c;前面的文章里介绍了 D-Bus 的基本概念以及调用远程方法的实例&#xff0c;本文介绍 D-Bus…

华为OD机试 - 抢7游戏(Java JS Python C)

题目描述 A、B两个人玩抢7游戏,游戏规则为: A先报一个起始数字 X(10 ≤ 起始数字 ≤ 10000),B报下一个数字 Y (X - Y < 3),A再报一个数字 Z(Y - Z < 3),以此类推,直到其中一个抢到7,抢到7即为胜者; 在B赢得比赛的情况下,一共有多少种组合? 输入描述 …

Selenium教程06:单选框+多选框+下拉框组件的示例练习

1.Radio单选框的示例用法&#xff0c;通过网页元素class和type属性多条件共同定位元素&#xff0c;模拟依次选中Android&#xff0c;Apple&#xff0c;Windows。 网页元素结构 <input type"radio" class"ivu-radio-input" name"ivuRadioGroup_170…

Redis 生产环境查找无过期时间的 key

在项目中,Redis 不应该被当作传统数据库来使用;储存大量没有过期时间的数据。如果储存大量无过期时间,而且无效的key的话;再加上 Redis 本身的过期策略没有被正确设置,就会大量占用内存。这样就会导致再多的内存资源也不够用。 情况大致是这样,项目中采用 Redis 二级存储…

君正 T23ZN T23双摄低功耗视频处理芯片

应用领域 •家用摄像机 •电池摄像机 •双摄摄像机产品 •门锁类产品 •视频门铃类产品 •USB摄像机 CPU XBurst -1core CPU 主频 1.2-1.4GHz -64KB L2 cache MCU 600MHz RISC-V协处理器 -RV32IM指令集 视频编码 H.264 视频编码 -最大性能:3MP(2304x*)40fps -支持…

【操作系统xv6】学习记录4 -CPU上下文:进程上下文、线程上下文、中断上下文

什么是cpu上下文 CPU 寄存器和程序计数器就是 CPU 上下文&#xff0c;因为它们都是 CPU 在运行任何任务前&#xff0c;必须的依赖环境。 什么是 CPU 上下文切换 先把前一个任务的 CPU 上下文&#xff08;也就是 CPU 寄存器和程序计数器&#xff09;保存起来&#xff0c;然后…

Linux之下载安装

rpm包管理 rpm介绍 rpm用于互联网下载包的打包及安装工具&#xff0c;他包含在某些linux分发版本中。他生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的steup.exe。 rpm包的查询指令 查询已经安装…