CMake set cache用法

devtools/2024/11/6 17:40:01/

在 CMake 中,set(<variable> <value>... CACHE <type> <docstring> [FORCE]) 语法中的 CACHE 是用于定义和存储全局变量的关键字。这种变量在 CMake 配置期间会被缓存,可以跨多个 CMake 配置调用之间保留其值,而不是每次都重新设置。下面详细说明 CACHE 的作用及其与普通 set 指令的区别:

1. CACHE 的作用

  • 缓存变量:添加 CACHE 后,变量会被存储到 CMake 的缓存文件(通常是 CMakeCache.txt)中。即使在 CMake 重新配置项目时,缓存变量的值仍然会被保留,而不会被覆盖。
  • 跨目录共享:由于缓存变量具有全局性,可以在所有 CMakeLists.txt 文件中访问,而不受限于变量的定义位置或作用域。
  • 用户配置:缓存变量允许用户在 CMake GUI 或命令行中设置选项。用户可以通过命令行设置缓存变量,如 cmake -D<variable>=<value> ..,这对于配置编译选项、路径等设置非常方便。

2. CACHE 与非 CACHE 变量的区别

  • 作用范围

    • 普通变量:作用范围通常局限于当前的 CMakeLists.txt 文件或其子目录(如果用 PARENT_SCOPE 可以传递到父目录)。
    • 缓存变量:具有全局作用范围,可以跨目录访问和共享。
  • 持久性

    • 普通变量:仅在当前 CMake 配置过程中有效,不会保存到缓存文件中。每次重新配置项目时,变量都会重新初始化。
    • 缓存变量:值会保存在缓存文件中,在下一次配置时继续使用之前的值,除非手动删除缓存或使用 FORCE 选项覆盖。

示例

假设在顶层 CMakeLists.txt 中定义了一个变量:

cmake"># 普通变量
set(MY_VAR "value")# 缓存变量
set(MY_CACHE_VAR "cached_value" CACHE STRING "This is a cached variable")
  • MY_VAR 是普通变量,仅在当前配置过程中有效。
  • MY_CACHE_VAR 是缓存变量,在 CMake 重新配置时不会被重新定义(除非使用 FORCE 参数强制覆盖)。

FORCE 选项

如果要强制更新缓存变量的值,可以使用 FORCE 选项:

cmake">set(MY_CACHE_VAR "new_value" CACHE STRING "This is a cached variable" FORCE)

这样可以在缓存文件中覆盖已经存在的 MY_CACHE_VAR 的值。

总结

使用 CACHE 可以让变量的值在 CMake 配置文件中持久化,并跨文件共享,适用于需要全局配置的选项。


http://www.ppmy.cn/devtools/131813.html

相关文章

第六章 DNS域名解析服务器

2、DNS域名解析的过程 3、DNS服务器配置 实验3&#xff1a;主从DNS服务器 将一个区域文件复制到多个服务器上的过程叫做区域传送。将主服务器上的信息复制到辅助服务器上来 实现。 &#xff08;1&#xff09;完全区域传送&#xff1a;复制整个区域文件

使用官网tar包制作OpenSSL及OpenSSH rpm包进行升级安装(OpenSSH_9.9p1, without OpenSSL未解决)

一、制作openssl-1.1.1w.rpm包 1、安装基础依赖包和rpmbuild及其依赖包 yum install curl which make gcc perl perl-WWW-Curl rpm-build rpm-build rpmdevtools tree -y yum install gcc-c glibc glibc-devel openssl openssl-devel \pcre-devel zlib zlib-devel perl…

2024 Rust现代实用教程Iterator迭代器

文章目录 一、迭代与循环1.循环2.迭代iteration3.区别 二、Intoiterator、Iterator和Iter之间的关系1.Intolterator2.Iterator Trait3. 源码中经常出现的iter 三、获取迭代器的三种方法iter(),iter_mut()和into_iter()1.iter()方法2.iter_mut()方法3.into_iter()方法---尽量写 …

BackTrader-Commission 06

Backtrader 策略实例&#xff0c;该部分内容通过使用backtrader对常用的策略实例的编写&#xff0c;提高和熟悉backtrader的实际场景的使用。 [Backtrader]实例:均线策略 [Backtrader] 实例:MACD策略 [Backtrader] 实例:KDJ 策略 [Backtrader] 实例:RSI 与 EMA 结合 [Backtrade…

Linux中more和less命令用法

一、more命令 more功能类似 cat &#xff0c;cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读&#xff0c;而最基本的指令就是按空白键&#xff08;space&#xff09;就往下一页显示&#xff0c;按 b 键就会往回&#xff08;back&am…

青少年编程与数学 02-003 Go语言网络编程 11课题、Go语言网络编程

青少年编程与数学 02-003 Go语言网络编程 11课题、Go语言网络编程 课题摘要:一、Go语言与网络编程二、Go语言网络编程分类1. 按协议分类2. 按应用层级分类3. 按服务类型分类4. 按并发模型分类5. 按编程范式分类6. 按安全需求分类7. 按性能要求分类8. 按开发框架分类 三、Go语言…

PostgreSQL 增量备份:保护你的数据资产

全文目录&#xff1a; 开篇语&#x1f4dc; 前言&#x1f4da; 增量备份概述&#x1f511; 增量备份的优势 &#x1f6e0;️ PostgreSQL 增量备份实施步骤&#x1f31f; 环境准备&#x1f680; 第一步&#xff1a;全量备份⏳ 第二步&#xff1a;定期增量备份&#x1f504; 第三…

【React】配置图标和题目

图标和题目这些基本配置都是在 public/index.html&#xff0c;直接修改 link 中的 favicon.ico 就是修改图标&#xff1b;title 标签就是题目修改。 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><link rel&…