关于CMake中不同变量的用法与总结

简介: 关于CMake中不同变量的用法与总结

CMake中的变量

CMake中变量的类型有多种:通过set设置的普通变量和缓存变量、环境变量、数组变量等等,由于CMake在生成的过程中会加载缓存的关系,因此用法不一样。

常用的变量设置语法:


set(<variable> <value>  
[[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])


普通变量


普通变量(normal variable)相当于编程中脚本内部变量,类似于脚本文件的局部变量,这种变量不能跨越CMakeLists.txt文档。普通变量定义方式如下:


set(var "value")


设置一个普通变量var,值为value,引号的作用可以详见我的另一篇文章。

和编程语言中局部变量的用法类似,这个变量会屏蔽CMake缓存中的同名变量,(类似局部变量屏蔽全局变量)。但是这条语句不会改变缓存中的var变量。


缓存变量


cache variable用于缓存变量,定义如下:


set(var "value" CACHE STRING "" FORCE) |


这条语句设置了一个CACHE语句,类型是STRING,说明信息为空字符串,上述都不能省略。

还有一种方法能够设置CACHE变量,就是通过cmake命令的-D选项,可以添加一个CACHE变量。

CACHE作用如下:

  • 如果缓存中存在同名的变量,根据FORCE来决定是否写入缓存:如果没有FORCE,这条语句不起作用,使用缓存中的变量;如果有FORCE,使用当前设置的值。
  • 注意,如果是FORCE,也能修改-D选项设置的CACHE变量,所以有可能传入的生成命令选项是无效的。
  • 如果缓存中不存在同名的变量,则将这个变量写入缓存并使用。

缓存变量也可以设置只在本文件内生效,将STRING类型改为INTERNAL即可。


环境变量


  • 读取环境变量:$ENV{...}
  • 设置环境变量:set(ENV{...} ...)


option变量


  • 主要是缓存的字符串,只能是ON或OFF,他们允许一些特殊的处理,如依赖,这个变量可以跨文本。
  • 不要将其option与set命令搞错。给定的值option实际上只是“初始值”(在第一个配置步骤中一次传送到缓存),之后将由用户通过CMake的GUI或者命令行进行更改

总结


正常使用的时候,如果有多层CMakeLists.txt,需要跨文本的变量,应该使用CACHE类型,如果只是当前文本的变量,则不需要使用CACHE,更重要的是,应该避免使用同名的普通和缓存变量。另外,由于CMake没有有效的清除缓存的方法,如果要彻底清除缓存,需要删除build或者release文件夹的所有文件

目录
相关文章
|
11月前
|
缓存 监控 网络安全
因服务器时间不同步引起的异常
因服务器时间不同步引起的异常
928 1
|
安全 Ubuntu Unix
/var/log/syslog日志说明
`/var/log/syslog`是Unix和Linux的日志文件,记录系统事件和消息,由`syslogd`或`rsyslogd`生成。日志条目含时间戳、主机名、PID、日志级别(如DEBUG、ERROR)和事件描述。内容涵盖系统启动/关闭、硬件错误、网络、用户登录、安全事件等。查看日志可使用`cat`、`tail`、`less`或`grep`命令。不过,不同Linux发行版可能有变,如Ubuntu使用`journald`和`journalctl`。
1274 3
|
Linux C++
通过C/C++代码设置Linux系统时间的方法与实例
Linux系统中的时间设置是关键任务之一,涉及日志记录、数据同步等众多应用场景。本文将详细介绍如何通过C/C++代码设置Linux系统时间,包括调用系统调用和使用第三方库,同时提供实例演示。
2594 2
|
11月前
|
存储 网络安全
Curl error (60): SSL peer certificate or SSH remote key was not OK for https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/x86_64/repodata/repomd.xml [SSL: no alternative certificate subject name matches target host name 'update.cs2c.com.cn']
【10月更文挑战第30天】在尝试从麒麟软件仓库(ks10-adv-os)下载元数据时,遇到 SSL 证书验证问题。错误提示为:`Curl error (60): SSL peer certificate or SSH remote key was not OK`。可能原因包括证书不被信任、证书与域名不匹配或网络问题。解决方法包括检查网络连接、导入 SSL 证书、禁用 SSL 证书验证(不推荐)、联系仓库管理员、检查系统时间和尝试其他镜像。
3273 1
|
3月前
|
C语言 C++
【实战指南】 C/C++ 枚举转字符串实现
本文介绍了在C/C++中实现枚举转字符串的实用技巧,通过宏定义与统一管理枚举名,提升代码调试效率并减少维护错误。
273 57
|
物联网 Linux 流计算
EasyLogger--不一样的打印输出
EasyLogger--不一样的打印输出
|
10月前
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
479 19
|
消息中间件 存储 物联网
RocketMQ 之 IoT 消息解析:物联网需要的消息技术
RocketMQ 5.0 是为应对物联网(IoT)场景而发布的云原生消息中间件,旨在解决 IoT 中大规模设备连接、数据处理和边缘计算的需求。
1464 108
|
监控 Linux 编译器
Linux C++ 定时器任务接口深度解析: 从理论到实践
Linux C++ 定时器任务接口深度解析: 从理论到实践
397 2