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 ...
随机推荐
- 【原理】从零编写ILI9341驱动全过程(基于Arduino)
最近在淘宝入手了一块ILI9341彩色屏幕,支持320x240分辨率.之前一直很好奇这类单片机驱动的彩色屏幕的原理,就打算自己写一个驱动,从电流层面操控ILI9341屏幕.话不多说,我们开始吧( ̄▽ ̄ ...
- 最小生成树kruskal 知识点讲解+模板
0.前言 因为本人太蒟了 我现在连NOIP的初赛都在胆战心惊 并且我甚至连最小生成树都没有学过 所以这一篇博客一定是最详细的QAQ 哈哈 请您认真看完如果有疏漏之处敬请留言指正 感谢! Thanks♪ ...
- CentOS6.8 LAMP
第一次配置LAMP运行环境,上网查询了很多资料,一边试命令一边学习.服务器重置了很多次. 虽然有OneinStack这个方便的网站一键命令部署,但知道这个网站却是我自己踩坑之后的事情了,故此记录. 1 ...
- 安装mysql8.0.17指南
1.首先,下载社区版mysql(下载地址https://dev.mysql.com/downloads/mysql/) 2.下载之后,将文件解压到自己想要安装的目录(如,本人将解压文件放置g://my ...
- 内置3D对象-Unity3D游戏开发培训
内置3D对象-Unity3D游戏开发培训 作者:Jesai 2018-02-12 19:21:58 五大面板: -Hierachy:当前场景中的物体 图 1-1 -Project:项目中的所有资源 图 ...
- Flask DBUtils
作用:创建连接池,解决多线程问题 1.安装模块 pip3 install -i https://pypi.douban.com/simple DBUtils 2.settings.py(配置文件) f ...
- shell 条件测试
1.文件相关 -e 判断文件或者文件夹是否存在 -d 判断目录是否存在 -f 判断文件是否存在 -r 判断是否有读权限 -w 判断是否有写权限 -x 判断是否有执行权限 1.1命令行使用 [root@ ...
- 在eclipse中导入源码
因为初学java有一个源码项目想要导入,在网上找了很多方法试了都不行,后来发现其实是想多了,这里说一个很简洁的方法.* 1.首先点eclipse中的File然后点import, 2. 然后选Gener ...
- set集合迭代
1.迭代遍历 Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator ...
- svn subvesion Branch Merge