美文网首页
Android NDK开发-CMake详解

Android NDK开发-CMake详解

作者: Lucky胡 | 来源:发表于2019-11-11 14:11 被阅读0次

概念

在Android Studio 2.2以上,构建原生库的默认工具是CMake。
CMake是一个跨平台的构建工具,可以用简单的语句描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。CMake并不直接构建出最终软件,而是产生其他工具的脚本(如makefile),然后再根据这个工具的构建方式使用。
CMake是一个比make更高级的编译配置工具,它可以根据不同的平台、不同的编译器,生成相应的makefile或vcproj项目,从而达到跨平台的目的。
CMake其实是个跨平台的支持产出各种不同的构建脚本的一个工具。

CMake文件

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

CMake语法

注释

#单行注释
#[[
    多行注释
    多行注释
]]

变量

CMake中所有变量都是string类型。
使用set()和unset()声明或移除一个变量
${变量名}

#声明变量
set(var 123)

#引用变量 message命令用来打印
message("var = ${var}")

列表

#声明列表
set(list 1 2 3 4)
set(list2 "1;2;3")

message("list=${list}")
message("list=${list2}")

#打印结果
#list=1;2;3;4
#list=1;2;3

流程控制

操作符
优先级:括号>一元>二元>逻辑


操作符

布尔常量值


布尔常量

条件命令

set(if_tap OFF)
set(elseif_tap ON)

if(${if_tap})
    message("if")
elseif(${elseif_tap})
    message("elseif")
else(${if_tap})
    message("else")
endif(${if_tap})
条件命令

循环命令

set(a " ")
while(NOT a STREQUAL "xxx")
    set(a "${a}x")
    message("a=${a}")
endwhile()
循环命令 循环遍历 循环遍历2 循环遍历3 循环遍历4

自定义函数


function(func a b c)
    message("func a=${a} b=${b}")
        #内置变量:输出参数个数
    message("ARGC ${ARGC}")
        #内置变量:输出参数列表
    message("ARGV ${ARGV}")
        #第一个参数
    message("ARGV0 ${ARGV0}")
        #第二个参数
    message("ARGV1 ${ARGV1}")

endfunction(func)

func(1 2 3)
自定义函数

自定义宏命令

宏命令

变量作用域

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

优先级
函数层覆盖目录层,目录层覆盖全局层。
在函数层用到了目录层的变量,对其进行了修改,并不会改变目录层该变量的值。

相关文章

网友评论

      本文标题:Android NDK开发-CMake详解

      本文链接:https://www.haomeiwen.com/subject/dvdtictx.html