CMake入门(1)

news/2025/1/30 23:20:39/

背景

目前很多大型框架都是使用cmake去构建,如果看不懂cmake, 在实际修改框架,添加新的模块时候就会受制于人,为此需要了解cmake的相关基础支持,避免被某些装逼大佬卡脖子,同时也进一步提高自己的业务水平。

变量

cmake里面的变量主要有两种方式:option 和 set 两种方式,简单如下:

set(var "hello") //set(变量名 值)
option(use_option "opiton" ON) //option(变量名 “信息说明” 值)

option

其实option可以等效于:

set(use_option ON CACHE BOOL "option") //set(变量 值 CACHE 类型 “信息说明”)

为什么说可以等效于set,因为可以通过生成的CMakeCache.txt查找到这个值。当在写CMakeLists.txt的时候没有给一个ON的值的时候(为空,为OFF, 或者其他乱七八糟的字符串的时候),我们查看CMakeCache.txt的时候会发现use_option都是被设置为OFF。
在这里插入图片描述

set

  • 变量类似于C++语言,有先后的顺序,只有先声明或者定义,后面的代码才可见。
  • 变量作用域概念,为了方便简单参考下面的文件布局,当在主目录的CMakeLists.txt中定义一个变量时,在first中CMakeLists.txt会把主目录的的变量拷贝到子目录,类似C++中的函数传值概念,所以在子目录中怎么修改都不会改变其他子目录的值,以及主目录的值。
    在这里插入图片描述
  • cache 概念,cache可以理解为全局变量,官网解释说当作一个config, 会存在CMakeCache.txt中,在定义的时候会给一个默认值。下面是一个demo, 首先在first文件中如下设置:
  set(first "first")set(cache "first set cache" CACHE STRING "test cache")message(STATUS "${first}")

在second中

  set(second "second")message(STATUS "${second}")message(STATUS "second show cache = ${cache}")set(cache "second change cache" CACHE STRING "SECOND TEST CACHE")message(STATUS "after chage in second = ${cache}")

在主目录中

  1 cmake_minimum_required(VERSION 3.12)2 project(hello)3 4 set(hello "hello")5 message(STATUS "${hello}")6 if(DEFINED cache)7     message(STATUS "${cache}")8 else()9     message(STATUS "no cache")10 endif()11 12 add_subdirectory(first)13 add_subdirectory(second)14 15 message(STATUS "main subdirectory =  ${cache}")

结果:cmake …
在这里插入图片描述
好好体会上面的代码。

关于set问题

  • 为什么在second中set(cache “second change cache” CACHE STRING “SECOND TEST CACHE”)没有生效??
  • 如果改成set(cache “second change cache”)会有什么效果?
  • cmake … -Dcache=“change cache” 执行呢?

回答

问题一:当CMakeCache.txt中已经有了变量名字,再次定义的会会被直接忽略。
问题二:当修改后,在second文件中会出现一个局部变量cache, cmake的逻辑是优先读取局部cache的值。效果如下:
在这里插入图片描述
问题三:可以理解在main目录下起始位置定义一个局部变量cache,后面子目录也会拷贝到自己的作用域,所以结果可想而知:
在这里插入图片描述


http://www.ppmy.cn/news/375441.html

相关文章

冰箱如何抗菌保鲜?这些小技巧别说你不知道

冰箱如何抗菌保鲜?从每天最基本的保存食物、保养冰箱开始做起。 第一,放在冰箱里的食品应尽量是新鲜的、干净的,因为质量好的食品,其微生物基数少,从而可减少繁殖后的微生物总数,且不易污染贮存在冰箱中其他…

看我们如何“把大象放进冰箱里”

一、数学家的办法 转自MITBBS 把大象放到冰箱里的分析学方法 1)先把大象微分,然后把它放到冰箱里,再在冰箱里把它积分。 2)重新定义冰箱或者大象的测度(如Radon测度)。 3)用Banach-Tarski定理…

“只换不修”的冰箱,你心动了吗?

COLMO冰箱作为高端冰箱第一品牌,在家电市场上成绩斐然。数据表明,COLMO冰箱销量再过去数月连续突破亿元,用实力坐稳高端家电巨头席位。而在销量的背后,COLMO冰箱深谙好的产品更需要匹配好的服务,不断升级售后服务&…

浅谈toB交付质量体系建设

笔者曾参加过某股份制商业制银行的私有云交付,就此谈谈toB交付项目中的质量保障问题。 首先说下什么是toB,再看下toB交付中的质量体系。 在讨论商业模式的时候,我们通常会说两种:toB和toC。toB(to Business&#xff…

六西格玛质量管理慕课答案

六西格码质量管理慕课答案 目录 第一章 第二章 第三章 第四章 第五章 第一章 1.质量的好坏由________来评判。 A.产品或服务的提供者 B.产品或服务的接收者 C.质量管理机构 D.质量认证机构 答案:B 2.质量的基础是________。 A.使用性能 B.质量特性 …

【方案】0519冰箱运行监测系统:方案分析

公众号关注 “DLGG创客DIY” 设为“星标”,重磅干货,第一时间送达。 最近向一些大牛请教,(大牛们)给出了很多建议,当然也指出了很多问题,从中也发现了很多欠思考欠推敲的地方,讲道理…

云米冰箱“失智”,问题不止“小米依赖症”

“先赚卖硬件的钱,再赚用硬件的钱。” 随着互联网科技逐渐渗透人们的生活,部分硬件厂家或许受到互联网思维的影响,总觉得硬件应该像软件那样,为公司创造持续的长期价值。 近日,云米冰箱强推广告且不能关闭一事登上微…

家用冰箱里面用的抽屉模具图档分析

1.产品说明及要求 此抽屉产品为透明件,熔接线及结构夹线构复杂,模具成型时多处位置需脱倒扣。 2.模具基本信息 (1)客户要求: 1)此产品为透明胶件,材料PS,产品重量:11…