CMake中的两种变量(Variable types in CMake)
在CMake中存在两种变量:normal variables and cache varialbes .正常变量就像是脚本内部变量,相当于程序设计中定义的局部变量那样。而CMakeLists.txt相当于一个函数,第一个执行的CMakeLists.txt相当于主函数。所以正常变量。不能跨越CMakeLists.txt文件(they are not persisted across CMake runs)。cache变量如果在set中设置成了INTERNAL,那么它与正常变量是一样的效果,就是两个CMakeLists.txt内部定义的变量不能共享(前提是这两个CMakeLists.txt之间没有包含关系,比如在src中有一个CMakeLIsts.txt在inc中有一个CMakeLists.txt ),也就是局部变量的作用仅仅在函数内部一样的效果,而正常变量的作用域仅在当前的CMakeLists.txt中。如果cache没有被设置成INTERNAL,那么相当于全局变量。都是在第一个执行的CMakeLists.txt中设置好的,当然可以在被包含的子CMakeLists.txt中修改cache值,此时也会影响父/主的CMakeLists.txt,这个变量用来配置整个工程的,配置好后会对整个工程适用。
normal variables and cache variables ,两种同名不同类型的变量在同一个CMakeLists.txt中,可以同时存在但是要有不同的值,就相当于程序中的全局变量和局部变量的名字可以是一样的。这两个同名变量,CMake首先搜索使用的是设置好了的正常变量,只有正常变量没有被设置的时候,才会默认的搜索使用设置好了的cache变量。如果一个cache变量被修改或者增加的时候,CMake会自动移除同范围内的同名的normal变量(也就是同一个CMakeLists.txt)。为了避免两种变量发生的冲突或者正常变量无意间隐藏cache变量,在工程中我们避免设置相同名字的normal变量和cache变量(Normally projects should avoid using normal and cache variables of the same name),但是在有些工程中我们可能会使用正常变量来隐藏cache变量的这一技巧。比如我们常见的工程目录,在一个工程中我们在主文件夹下面会有一个CMakeLists.txt文件,然后在src文件夹中也会有一个CMakeLists.txt,然后在主文件中的CMakeLists.txt中add_subdirectories(src),主 子 CMakeLists.txt建立起了联系,这个时候我们在主文件的CMakeLists.txt中设置一个cache变量 比如设置编译器选项,通常情况下,src子目录中的编译器选项也是被设置成了与父目录的编译器同样的,但是假设在子目录中我们想要单独为子目录设置不一样的编译器选项,那么我们必须要建立一个同名的cache变量,当然之前已经有一个cache变量了,所以此时的set()仅仅是修改了那个cache变量的值,变为了适用于子目录的编译器选项,如果这样设置的话,那么主/父目录中的编译器选项就会被修改。为了避免这种情况,可以在主/父目录中的CMakeLists.txt中在设置一个正常的同名的变量,对应编译器选项的值。这样主CMakeLists.txt在执行的时候,正常变量会隐藏cache变量,直接访问normal varables 获取编译器选项的设定值,即使子目录修改cache变量的值也不会影响父目录的编译器选项的设置情况。
补充一点:If <value> is not specified then the variable is removed instead of set. See also: the unset() command.通过下面的设定可以删除指定的变量(原文没有指出是哪种变量,所以默认是normal 和cache两种变量都可以)。
set(<variable> <value1> ... <valueN>)
参考资料:
1、https://cmake.org/cmake/help/v3.0/command/set.html
CMake中的两种变量(Variable types in CMake)的更多相关文章
- 【转载】CMake 两种变量原理
原文地址:https://cslam.cn/archives/c9f565b5.html 摘要: 本文记录一下 CMake 变量的定义.原理及其使用.CMake 变量包含 Normal Variabl ...
- CMake 两种变量原理
目录 [TOC] 1.两种变量的定义参考 2.两种变量的作用域原理及使用 1.Normal Variables (1).包含 add_subdirectory().function().(本质是值拷贝 ...
- MySQL中的两种临时表
MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...
- Crystal Report在.net中的两种显示方式
Crystal Report在.net中的两种显示方式 编写人:CC阿爸 2014-7-29 近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一 ...
- eclipse中的两种Jre 及 Jre与Jdk的区别
分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK ...
- Scala的两种变量
Scala有两种变量,val和var.val类似于Java的final变量,一旦初始化了,就不能再赋值了.var如同Java中的非final变量,可以在生命周期内被多次赋值.
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符
//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...
随机推荐
- SpringBootTest 测试工具
以下内容,翻译自官方文档,并结合了学习过程的demo. Spring Boot提供了许多实用程序和注解,帮助测试应用程序.测试支持由两个模块提供:spring-boot-test 包含核心项,spri ...
- Python库的安装(Windows/Linux通用)
pip安装 最简单的安装方式,自动下载并安装. pip:包管理工具 安装步骤 执行安装命令:pip install <package_name> wheel安装 在网速较差的情况下适用. ...
- 常用加密算法-Delphi XE 10.3.3
主要用到 DELPHI XE 10.2新增HASH函数 class function TUtils.GetStringMD5(const AInPut: string): string; begin ...
- TensorFlow——卷积神经网络的相关函数
在TensorFlow中,使用tr.nn.conv2d来实现卷积操作,使用tf.nn.max_pool进行最大池化操作.通过闯传入不同的参数,来实现各种不同类型的卷积与池化操作. 卷积函数tf.nn. ...
- 安装Mysql 8.0的艰难体验
背景: Mysql 8.0 以后版本,在性能等方面有了很大提升,而且在自动编号.Timestamp等字段的设置上有了很方便的进步,因此在一年前即开始将原有的基于5.5版本的服务器逐渐向8.0转移.但转 ...
- 理解Stream(一)——串行与终止操作
Java 8 stream特性是一个能快速降低开发人员工作量的语法糖,用起来很简单,用好了很难.这里就通过一系列的博客对几个常见的错误进行解释说明,并给出替代方法.这里先说明串行和终止操作. 首先,给 ...
- 若依框架. 仿ThymeLeaf前端SelectDictLable方法
在framework项目下新增所需服务
- 去除Linux中的^M
(1)安装tofrodos sudo apt-get install tofrodos (2)做一些优化 ln -s /usr/bin/todos /usr/bin/unix2dos ln -s /u ...
- 开发者必须要了解的架构技术趋势:Service Mesh
内容概要 Service Mesh 是干啥的?解决了什么问题? Service Mesh 的特性 Service Mesh 的主流实现有哪些? 1. Service Mesh 是什么? 简单来讲,Se ...
- [分块][bitset][RMQ]区间
源自 ditoly 大爷的 FJ 省队集训模拟赛题 Statement 给定一个长度为 \(n\) 的序列 \(a\) ,有 \(m\) 次询问 每次询问给出一个 \(k\) ,再给出 \(k\) 个 ...