cmake入门(1)

背景

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

变量

变量是编程里的基本元素,所以弄懂变量是最最关键的,cmake里面的变量主要分为两种:

  • CACHE
  • 非CACHE
CACHE变量

CACHE类型的变量可以理解为全局变量。定义方式主要有三种:

set(var "hello" CAHCE STRING "set val as global var") //set(变量 值 CACHE 类型 “信息说明”)
option(var "set val as global var" ON) // = set(var   ON    CACHE      BOOL     "set val as global var" )
cmake .. -Dvar="world"                 // = set(var "world" CACHE UNINITIALIZED " " )
  • set 方式
    set 方式会声明一个CACHE变量,包括变量名和变量类型,以及一个待定默认值(如果用户通过-D传入的话,则该值就会被替换掉,否则就会被正常使用, 凡事都有特殊,假如用户传入一堆参数,比如-Dapple=ON, -Dwindows=ON,这玩意windows就不能为ON,所以可以强制不接受参数:set(CMAKE_CUDA_ARCHITECTURES “ivcore11” CACHE STRING “CUDA architectures” FORCE)
  • option 方式
    等效于set的方式, 由于是BOOL类型,当在写CMakeLists.txt的时候没有给一个ON的值的时候(为空,为OFF, 或者其他乱七八糟的字符串),我们查看CMakeCache.txt的时候会发现use_option都是被设置为OFF。所以option就当一个BOOL值使用,最好不要整其他乱七八糟的字符串。
  • -D 方式
    这种方式有两种情况:第一,-D后面的变量在CMakeLists.txt中没有按上面方式申明(set, option), 这样话就会在程序起始位置自动生成一个未被初始话的CACHE变量。 第二,-D后面变量被声明了,那就自动替换待定默认值

同名字时使用优先选择局部变量:距离使用位置最近的一次定义,不管是非CACHE还是CACHE, 谁离使用的时候近,谁就会被调用, 如果非要使用CACHE的值,就使用下面的方式:
在这里插入图片描述
在这里插入图片描述
当同一个cache 变量被定义多次时候,值为首次定义的结果 有时候比如CMAKE_CXX_COMPILER这种变量,其实在project(CXX) 或者enable(CXX)的时候都会默认再定义一次,所以如果想自定义的话一定要选择正确的位置。当然cmake也提供了一个强制刷新的选项,就是FORCE, 好处是如果cmakelist.txt的代码太多话不清楚之前哪里是否定义过,这样可以省事很多。

set(var "xxxx" CACHE STRING "test")  
message(before ${var}) // xxxx
set(var "yyyy" CACHE STRING "test" FORCE)  //这样的话即使第二次也会刷
message(aftore ${var}) // yyyy

这里有个问题就是,如果你不清空build文件内的其他文件,下次你再cmake …的时候,当运行到第一行的设置命令时会自动忽略,所以结果还是缓存中的yyyy,为了避免这种情况出现,我们要不两个set的末尾都加上FORCE, 要不就每次清空build文件。当然如果这个值确定每次用yyyy都可以的话,那也无所谓了

非CACHE变量
  • set
  • 使用方式: set(var value), 也可以set(var value1 value2 value3 …) ,或者list(APPEND var value_n), 可以理解为一个vector
  • 变量类似于C++语言,有先后的顺序,只有先声明或者定义,后面的代码才可见。
  • 变量作用域概念,为了方便简单参考下面的文件布局,当在主目录的CMakeLists.txt中定义一个变量时,在first中CMakeLists.txt会把主目录的的变量拷贝到子目录,类似C++中的函数传值概念,所以在子目录中怎么修改都不会改变其他子目录的值,以及主目录的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值