CMake
CMake
什么是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安装
通过官网 https://cmake.org/ 下载。
Linux
Windows
VSCode配置CMake
加载CMake和CMake Tools插件。
在VSCode中,打开命令面板,输入并点击CMake:快速入门
,
emmm,上面GCC个人配置错误了,点击切换到MSVC。点击Build构建。
构建完成后,就可发现build
目录,多了很多东西。我们找到Debug目录,就能找到可执行文件,。通过终端切换到Debug
目录下,执行./cmaketest
命令,。
CMakeLists.txt
CMake变量
声明变量: CMake中所有变量都是string类型。
1 | set(变量名 变量值) |
引用变量:
1 | ${变量名} |
移除变量:可以使用set()和unset()命令来声明或移除一个变量
1 | unset(变量名) |
【例】
1 | # TODO CMake变量 |
CMake列表(lists)
声明列表:set(列表名 值1 值2 … 值N) 或 set(列表名 “值1;值2;…;值N”)。
1 | # TODO CMake列表(lists) |
输出结果
1 | [cmake] list_var=12345 |
Cmake流程控制
条件命令
1 | # TODO CMake流程控制-条件命令 |
输出结果
1 | [cmake] |
循环命令
while循环
1 | # TODO CMake流程控制-循环命令 |
输出结果
1 | [cmake] >>>>>>a = x |
foreach循环+RANGE 区间
1 | foreach(item 1 2 3) |
输出结果
1 | [cmake] 1item = 1 |
Cmake函数
内置函数
查看函数的详细用法,请看CMake的文档,太多了。
添加库 add_library(var paths…)
文件查找函数 file(GLOB var path)
能够快速匹配文件,支持通配符(wild card)。
输出字符串 message(‘string’)
收集指定目录 aux_source_directory( )
设置语言标准 add_compile_options(-std=c++17)
链接库 target_link_libraries( … - … …)
自定义函数
1 | # TODO CMake自定义函数 Shell的函数很类似 |
输出结果
1 | [cmake] call funcName method |
编译动态库与静态库
在CMakeLists
中使用add_library添加静态库(默认静态库)和动态库(添加动态库Flag SHARED)。
1 | # 添加一个库,默认是静态库。 |
链接静态库和动态库
内部链接
通常情况下,我们都会创建include
头文件目录用于存放头文件,创建src
目录用于存放源文件。如图:,也就这样,头文件和源文件不在一个目录下,源文件必须使用类似#include "../include/add_sub.h"
相对目录的形似指定头文件,非常的麻烦。
当然,CMake具备内部链接的功能。在CMakeLists.txt
配置文件中,且在添加可执行文件前,使用函数include_directories()
,添加include,直接include_directories(./include)
即可。
对于源代码的配置,我们可以在src
目录下,增加一个CMakeLists.txt
,,然后在外部CMakeLists.txt
中添加add_subdirectory(./src)
,其中./src
是源文件目录的相对路径。
最后我们链接目标库:
- 链接静态库
target_link_libraries(cmaketest add_sub)
。 - 链接动态库
target_link_libraries(cmaketest SHARED add_sub)
。
外部链接
Cmake预编译库与依赖源码方式
CMake文档
CMake的学习追求循序渐进,不是一蹴而就的。不懂的查文档即可,把时间放在更需要的地方上面。