当前位置: 首页 > news >正文

CMake系列讲解(入门篇)1.8 基础命令CMake-set() unset()


基础命令set() unset()

〓〓〓〓〓〓〓〓踏实学CMake总目录〓〓〓〓〓〓〓〓〓〓


8. set() unset()

在CMake中,set用于设置变量的值。这个变量可以为普通变量、Cache或者是环境变量。
如果提供了一个或多个 <value> 参数,则将 <variable> 设置为给定的值。
如果没有提供 <value> 参数,则取消设置 <variable>,将其值设置为无,相当于unset

8.1 设置普通变量

8.1.1 命令格式

set(<variable> <value>... [PARENT_SCOPE])
unset(<variable>... [PARENT_SCOPE])

8.1.2 参数说明

  • variable:要被赋值的变量
  • value:要赋给变量的值

PARENT_SCOPE是一个修饰符,用于指定变量的作用域为父级作用域。

当在函数或宏中设置变量时,使用PARENT_SCOPE修饰符可以将该变量的作用域提升到父级作用域,使得在函数或宏外部也能够访问和使用该变量。 如下示例

8.1.3 使用示例

function(set_variable)set(variable "Hello, World!" PARENT_SCOPE)
endfunction()set_variable()
message("${variable}")  # 输出:Hello, World!

在上面的示例中,set_variable函数内部使用set命令设置了变量variable的值,并使用PARENT_SCOPE修饰符将其作用域提升到调用函数的作用域。因此,message命令在函数外部打印出了变量variable的值。

需要注意的是,PARENT_SCOPE修饰符只能将变量的作用域提升到直接的父级作用域,无法跳过中间的作用域。如果要将变量的作用域提升到更高层次的作用域,需要在对应的父级作用域中再次使用set命令。

8.2 设置Cache变量

set命令可以用于设置缓存变量(cache entry),并提供用户可设置的值。

8.2.1 命令格式

set(<variable> <value>... CACHE <type> <docstring> [FORCE])
unset(<variable>... CACHE)

8.2.2 参数说明

  • <variable>:要设置的缓存变量的名称。
  • <value>:要为缓存变量设置的值(可以有多个)。
  • CACHE:指定该变量是一个缓存变量。
  • <type>:变量的类型,可以是以下之一:
    • BOOL:布尔类型,即开/关(ON/OFF)值。cmake-gui 提供一个复选框。
    • FILEPATH:指向磁盘上文件的路径。cmake-gui 提供一个文件对话框。
    • PATH:指向磁盘上目录的路径。cmake-gui 提供一个文件对话框。
    • STRING:字符串类型,即文本行。cmake-gui 提供一个文本字段或下拉选择(如果设置了 STRINGS 缓存变量属性)。
    • INTERNAL:内部类型,即文本行。cmake-gui 不显示内部变量。内部变量可用于持久保存跨运行的变量。使用此类型会隐含使用 FORCE。
  • FORCE:可选项,用于强制覆盖现有的缓存变量。缓存默认是不覆盖的,如果在调用之前缓存项不存在,或者给出了FORCE选项,那么缓存项将被设置为给定的值。

8.2.3 使用示例:

cmake_minimum_required(VERSION 3.5)
project(hello_library)set(MY_VARIABLE "Hello, World!" CACHE STRING "A greeting message" FORCE)
message("${MY_VARIABLE}")   # 输出Hello, World!set(MY_VARIABLE "Good Morning!" CACHE STRING "A greeting message")
message("${MY_VARIABLE}")   # 输出Hello, World!因为不加FORCE默认不覆盖set(MY_VARIABLE "Good Morning!" CACHE STRING "A greeting message" FORCE)
message("${MY_VARIABLE}")   # 输出Good Morning! 加了FORCE强制覆盖

注意,如果已经存在同名的普通变量,则不能直接访问缓存变量的内容。最好不要存在同名的。

此外,如果在调用CMake命令时,用户通过命令行选项"-D<var>=<value>"来创建缓存变量,并且在这种情况下,如果没有指定类型,缓存变量将存在但没有类型。对于特殊类型的变量(如路径类型),相对路径会被转化为绝对路径,以确保准确性。

例如:在执行CMake命令时,使用以下语句:
cmake -DMY_PATH="../relative/path",创建了一个缓存变量,但未指定类型。为了为该变量设置类型并将相对路径转换为绝对路径,可以在CMakeLists.txt文件中使用"set"命令:set(MY_PATH "${MY_PATH}" PATH),这样,通过"set"命令,为变量"MY_PATH"添加了类型"PATH"。同时,如果"MY_PATH"的值是相对路径,CMake将将其视为相对于当前工作目录,并将其转换为绝对路径。

8.3 设置系统变量

设置环境变量的值,执行这个命令时,它只会对当前的 CMake 进程中的环境变量进行修改。它不会影响调用 CMake 的进程的环境变量,整个系统环境,或者后续构建或测试过程的环境变量。

8.3.1 命令格式

set(ENV{<variable>} [<value>])
unset(ENV{<variable>})

8.3.2 参数说明

  • <variable>: 是环境变量的名称
  • <value>: 要设置的值

如果没有提供<value> 或者<value> 是空字符串,该命令将清除环境变量的任何现有值。
在 set(ENV{} []) 命令之后提供的任何参数都会被忽略。如果发现额外的参数,将会发出作者警告。

8.3.3 使用示例

cmake_minimum_required(VERSION 3.5)
project(setCommand)
# 设置一个名为 MY_VARIABLE 的环境变量,其值为 Hello World:
set(ENV{MY_VARIABLE} "Hello World")
message(">>> MY_VARIABLE: $ENV{MY_VARIABLE}")
# 清除名为 PATH 的环境变量的值
set(ENV{MY_VARIABLE})
message(">>> MY_VARIABLE: $ENV{MY_VARIABLE}")
# 设置一个名为 NUM_THREADS 的环境变量,其值为 4set(ENV{NUM_THREADS} 4)
message(">>> NUM_THREADS: $ENV{NUM_THREADS}")
# 清除名为 DEBUG_FLAG 的环境变量的值:
unset(ENV{NUM_THREADS})
message(">>> NUM_THREADS: $ENV{NUM_THREADS}")

输出如下:

>>> MY_VARIABLE: Hello World
>>> MY_VARIABLE: 
>>> NUM_THREADS: 4
>>> NUM_THREADS:

附:返回总目录的传送门如下:

〓〓〓〓〓〓〓〓踏实学CMake总目录〓〓〓〓〓〓〓〓〓〓

相关文章:

CMake系列讲解(入门篇)1.8 基础命令CMake-set() unset()

基础命令set() unset() 〓〓〓〓〓〓〓〓踏实学CMake总目录〓〓〓〓〓〓〓〓〓〓 8. set() unset() 在CMake中&#xff0c;set用于设置变量的值。这个变量可以为普通变量、Cache或者是环境变量。 如果提供了一个或多个 <value> 参数&#xff0c;则将 <variable> 设…...

【C++ 学习 ㉙】- 详解 C++11 的 constexpr 和 decltype 关键字

目录 一、constexpr 关键字 1.1 - constexpr 修饰普通变量 1.2 - constexpr 修饰函数 1.3 - constexpr 修饰类的构造函数 1.4 - constexpr 和 const 的区别 二、decltype 关键字 2.1 - 推导规则 2.2 - 实际应用 一、constexpr 关键字 constexpr 是 C11 新引入的关键字…...

js获取视频编码

一.背景 有些浏览器不支持某些视频的编码方式导致播放出现问题&#xff0c;这个时候要限制视频上传 二.插件 https://unpkg.com/mediainfo.js0.1.4/dist/mediainfo.min.js 三.完整html代码 <!DOCTYPE html> <html lang"en"> <head><meta ch…...

560. 和为 K 的子数组 --力扣 --JAVA

题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的连续子数组的个数 。 子数组是数组中元素的连续非空序列。 解题思路 数组项累加可以使用双层循环进行遍历&#xff1b;子数组的长度是不确定的&#xff0c;也可能存在1 1 2和1 1 - 1…...

【趣味随笔】农业机器人的种类与发展前景

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

使用CountdownLatch和线程池批量处理http请求,并处理响应数据

背景和问题 ​ 背景&#xff1a;最近项目的一个接口数据&#xff0c;需要去请求其他多个服务器的数据&#xff0c;然后统一返回&#xff1b; 问题点&#xff1a;如果遍历所有的服务器地址&#xff0c;然后串行请求就会出现请求时间过长&#xff0c;加入需要请求十个服务器&…...

记录--怎么写一个可以鼠标控制旋转的div?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 说在前面 鼠标控制元素旋转在现在也是一个很常见的功能&#xff0c;让我们从实现div元素的旋转控制开始来了解元素旋转的具体原理和实现方法吧。 效果展示 体验地址 code.juejin.cn/pen/7290719… 实现…...

JVM第十八讲:调试排错 - Java 问题排查之工具单

调试排错 - Java 问题排查之工具单 程序员想要有更好的发展&#xff0c;排查问题的能力一定得加强。举个例子&#xff1a;cpu100% 怎么排查&#xff0c;线上接口逐渐变慢了该怎么排查&#xff1f;慢查询该如何治理&#xff1f;你的思路是啥&#xff1f;本文是JVM第十八讲&#…...

JAVA基础-正则表达式(12)

目录 Java 正则表达式正则表达式实例正则表达式语法 Matcher 类的方法索引方法查找方法替换方法start 和 end 方法 Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言&#xff0c;但是在每种语言中有细…...

[论文笔记]GPT-1

引言 今天带来论文Improving Language Understanding by Generative Pre-Training的笔记,它的中文题目为:通过生成式预训练改进语言理解。其实就是GPT的论文。 自然语言理解可以应用于大量NLP任务上,比如文本蕴含、问答、语义相似和文档分类。虽然无标签文本语料是丰富的,…...

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割1(综述篇)

在上一个关于3D 目标的任务&#xff0c;是基于普通CNN网络的3D分类任务。在这个任务中&#xff0c;分类数据采用的是CT结节的LIDC-IDRI数据集&#xff0c;其中对结节的良恶性、毛刺、分叶征等等特征进行了各自的等级分类。感兴趣的可以直接点击下方的链接&#xff0c;直达学习&…...

css之Flex弹性布局

文章目录 &#x1f415;前言&#xff1a;&#x1f3e8;定义flex容器 display:flex&#x1f3e8;在flex容器中子组件进行排列&#x1fa82;行排列 flex-direction: row&#x1fa82;将行排列进行翻转排列 flex-direction: row-reverse&#x1f3c5;按列排列 flex-direction: col…...

web.xml配置详解

在Java Web应用程序中&#xff0c;web.xml是一个XML配置文件&#xff0c;用于定义和配置Servlet、过滤器、监听器和其他Web应用程序组件的行为和属性。web.xml文件通常位于Web应用程序的WEB-INF目录下&#xff0c;用于描述Web应用程序的部署信息和配置。以下是一些web.xml配置的…...

关于我学习Go语言在CSDN分享的心得体会

最近我一直在学习Go语言&#xff0c;并通过CSDN平台分享我的学习心得和体会。在这篇博客中&#xff0c;我将与大家分享我在学习Go语言过程中的经验和收获。希望通过这篇博客能够帮助其他Go语言初学者更好地掌握这门语言&#xff0c;并与广大Go语言爱好者进行交流和互动。 选择…...

Java类的Builder应用以及使用@Data和@Builder高效应用Builder

⭐Java Builder模式&#xff1a;是Java设计模式之一&#xff0c;它属于对象创建型模式&#xff0c;是将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 结论一&#xff1a;使用lombok的Data和Builder注解构建Java类的Builder简洁高效&am…...

【Qt控件之QTabWidget】介绍及使用

描述 QTabWidget类提供了一个带有选项卡的小部件堆栈。 选项卡小部件提供了一个选项卡栏&#xff08;参见QTabBar&#xff09;和一个“页面区域”&#xff0c;用于显示与每个选项卡相关联的页面。默认情况下&#xff0c;选项卡栏显示在页面区域的上方&#xff0c;但可以使用…...

Linux实战——网络连接模式的三种模式

Linux可以分为三种网络模式&#xff1a; 桥接模式 &#xff08;vmnet0) 仅主机模式 (vmnet1) NAT模式 (vmnet8) 当我们下载了vmware之后&#xff0c;在电脑会出现两个虚拟网卡&#xff0c;VMware Network Adapter VMnet1、VMware Network Adapter VMnet8。 可以通过查找 控…...

嵌入式实时操作系统的设计与开发(任意大小的内存管理)

任意大小的内存管理是根据用户需要为其分配内存&#xff0c;即用户需要多大内存就通过acoral_malloc2()为之分配多大内存&#xff0c;同时每块分配出去的内存前面都有一个控制块&#xff0c;控制块里记录了该块内存的大小。 同时未分配出去的内存也有一个控制块&#xff0c;寻…...

文件读取结束的判定

大家好啊&#xff0c;我们今天来补充文件操作的读取结束的判定。 被错误使用的feof 牢记&#xff1a;在文件读取过程中&#xff0c;不能用feof函数的返回值直接用来判断文件的是否结束而是应用于当文件读取结束的时候&#xff0c;判断是读取失败结束&#xff0c;还是遇到文件尾…...

《基于 Vue 组件库 的 Webpack5 配置》9.module.exports 可为数组类型且注意编译顺序

module.exports常见是对象类型&#xff0c;其实也可用数组类型&#xff1b;注意编译顺序&#xff0c;从后往前 编&#xff1a; 也就是说先编 another.js&#xff0c;再编 index.js&#xff1b;所以代码第 9 行不能设置为 true&#xff0c;仅在第一次&#xff0c;也就是代码第19…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...