CMake详解

本文详细介绍了CMake,一个跨平台的构建工具,用于管理项目的构建过程。内容涵盖CMake的基本概念、源文件、变量、作用域、列表、流程控制、自定义函数和宏命令,以及常用命令的使用,特别讨论了在Android开发中的应用,包括不同Android版本下的库添加和编译配置。同时,文章探讨了CMake的message命令及其在不同CMake版本中的输出差异,并提供了兼容性解决方案。
摘要由CSDN通过智能技术生成

什么是CMake

  • 在android studio 2.2及以上,构建原生库的默认工具是 CMake。

  • CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。Cmake 并不直接建构出最终的软件,而是产生其他工具的脚本(如Makefile ),然后再依这个工具的构建方式使用。

  • CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。从而达到跨平台的目的。Android Studio利用CMake生成的是ninja,ninja是一个小型的关注速度的构建系统。我们不需要关心ninja的脚本,知道怎么配置cmake就可以了。从而可以看出cmake其实是一个跨平台的支持产出各种不同的构建脚本的一个工具。

CMake源文件

  • CMake的源码文件可以包含命令、注释、空格、和换行。
  • 以CMake编写的源文件以CMakeLists.txt命名或以.cmake为扩展名。
  • 可以通过add_subdirectory()命令把子目录的CMake源文件添加进来。
  • CMake源文件中所有的语句都是命令,可以是内置命令或自定义的函数/宏命令

CMake变量

  • CMake中所有变量都是string类型。可以使用set()和unset()命令来声明或者移除一个变量
  • 变量的引用:${变量名}
#声明变量:SET(变量名  变量值)
SET(var 666)
#引用变量 message命令用来打印
MESSAGE("var=${var}")

CMake变量的作用域

  • 全局层:cache变量,在整个项目范围内,一般在SET定义变量时,指定CACHE参数就能定义为cache变量。
  • 目录层:在当前目录CMakeLists.txt中定义,以及在该文件包含的其它cmake源文件中定义的变量。
  • 函数层:在命令函数中定义的变量,属于函数作用域内的变量。

CMake列表(lists)

  • 列表也是字符串,可以把列表看做一个特殊的变量,这个变量有多个值。
  • 语法格式:SET(列表名 值1 值2… 值N)或者SET(列表名 “值1;值2;…值N”)
  • 列表的引用 ${列表名}
#SET(列表名 值1 值2... 值N)
#或者SET(列表名 “值1;值2;...值N”)
SET(list_var 1 3 5 7)
#或
SET(list_var "1;3;5;7")
MESSAGE("list_var=${list_var}")

CMake流程控制-布尔常量

类型
true 1,ON,YES,TRUE,Y,非0的值
false 0,OFF,NO,FALSE,N,IGNORE,NOTFOUND,
空字符串,以-NOTFOUND结尾的字符串

CMake流程控制-操作符

类型
一元 EXIST,COMMAND,DEFINED
二元 EQUAL,LESS,LESS_EQUAL,GREATER,GREATER_EQUAL,
STREQUAL,STRLESS,STRLESS_EQUAL,STRGREATER,
STRGREATER_EQUAL,VERSION_EQUAL,VERSION_LESS,
VERSION_LESS_EQUAL,VERSION_GREATER,VERSION_GREATER_EQUAL,MATCHES
逻辑 NOT,AND,OR

CMake流程控制-循环遍历

循环遍历一

  • 语法格式:
    foreach(循环变量 参数1 参数2 … 参数n)
    COMMAND(ARGS …)
    endforeach(循环变量)
  • 每次迭代设置循环变量为参数。
  • foreach也支持breack()和continue()命令跳出循环。
FOREACH(item 2 4 6)
    MESSAGE("item=${item}")
ENDFOREACH(item)    

循环遍历二

  • 语法格式:
    foreach(循环变量 RANGE total)
    COMMAND(ARGS …)
    endforeach(循环变量)
  • 循环范围从0到total。
FOREACH(item RANGE 6)
    MESSAGE("item=${item}")
ENDFOREACH(item)    

循环遍历三

  • 语法格式:
    foreach(循环变量 RANGE start stop step)
    COMMAND(ARGS …)
    endforeach(循环变量)
  • 循环范围从start到stop,循环增量为step。
FOREACH(item RANGE 1 6 2)
    MESSAGE("item=${item}")
ENDFOREACH(item)    

循环遍历四

  • foreach还支持对列表的循环。
  • 语法格式:
    foreach(循环变量 IN LISTS 列表)
    COMMAND(ARGS …)
    endforeach(循环变量)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值