在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)的更多相关文章

  1. 【转载】CMake 两种变量原理

    原文地址:https://cslam.cn/archives/c9f565b5.html 摘要: 本文记录一下 CMake 变量的定义.原理及其使用.CMake 变量包含 Normal Variabl ...

  2. CMake 两种变量原理

    目录 [TOC] 1.两种变量的定义参考 2.两种变量的作用域原理及使用 1.Normal Variables (1).包含 add_subdirectory().function().(本质是值拷贝 ...

  3. MySQL中的两种临时表

    MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...

  4. Crystal Report在.net中的两种显示方式

    Crystal Report在.net中的两种显示方式 编写人:CC阿爸 2014-7-29 近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一 ...

  5. eclipse中的两种Jre 及 Jre与Jdk的区别

    分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK ...

  6. Scala的两种变量

    Scala有两种变量,val和var.val类似于Java的final变量,一旦初始化了,就不能再赋值了.var如同Java中的非final变量,可以在生命周期内被多次赋值.

  7. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  8. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  9. validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符

    //校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...

随机推荐

  1. 小小知识点(二十三)circularly symmetric complex zero-mean white Gaussian noise(循环对称复高斯噪声)

    数学定义 http://en.wikipedia.org/wiki/Complex_normal_distribution 通信中的定义 在通信里,复基带等效系统的噪声是复高斯噪声,其分布就是circ ...

  2. centos7.3安装chrome

    Centos7安装chrome浏览器 1.配置yum源 在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo cd /ect/yum.repos.d/ vim ...

  3. 什么是 Google Play服务

    Google Play服务用于更新Google应用和Google Play提供的其他应用. 此组件可提供多种核心功能,例如对您的Google服务进行身份验证.同步联系人信息.提供最新的用户隐私设置,以 ...

  4. mysql oracle sql获取树 父级 子级 及自己

    select * from ( select t.*,d.TABLE_NAME,d.QUERY_SQL,d.data_control_col,d.id table_id,d.where_sql fro ...

  5. MySQL之性能优化

    查看执行计划explain     1.1 Explain命令:它可以对select语句进行分析,并输出select执行的详细信息,以对开发人员针对性优化  1.2 Explain的用法:在selec ...

  6. 【记】Linux下安装JDK1.7

    Java官网已经不提供除最新版本以外版本的JDK下载了,下载JDK1.7,密码: rsqg 本地Linux系统为Centos6.9,本身就没安装Java:已安装Java需要先卸载,卸载方法请百度. 1 ...

  7. 【笔试/面试题】中科创达——9.28(持续更新ing)

    1. 线程与进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独 ...

  8. ArcEngine 创建线要素图层

    在创建要素图层的时候,默认的几何类型是Polygon: Dim objectClassDescription As IObjectClassDescription = New FeatureClass ...

  9. “云”端的语雀:用 JavaScript 全栈打造商业级应用

    作者|  不四(死马)蚂蚁金服 语雀产品技术负责人 语雀是什么? 语雀是一个专业的云端知识库,面向个人和团队,提供与众不同的知识管理,打造轻松流畅的工作协同,它提供各种格式的在线文档(富文本.表格.设 ...

  10. python的list()函数

    list()函数将其它序列转换为 列表 (就是js的数组). 该函数不会改变   其它序列 效果图一: 代码一: # 定义一个元组序列 tuple_one = (123,','abc') print( ...