CMake基础
文章目录
前言
自从 AndroidStudio2.2 开始支持 CMAKE 来构建 C/C++ 程序之后,作为 Android 开发就可以使用 CMake 来替换 Android.mk 了。
基本使用
在学习 CMAKE 之前,我们先来看一下如何使用 CMAKE 编译项目。假设 CMakeLists.txt 已经编写完毕,并且是正确的。
|
|
在这个例子中,我们建了一个 build 文件夹用于执行 cmake 指令,这种做法叫做外部编译(out-of-source-build)。注意 cmake .. 这后边有个 .. 这是用于告诉 CMAKE CMakeLists.txt 在哪个文件夹下。
这样做有一个好处就是不会污染源码,因为在执行 cmake 的过程中会产生一些临时文件、缓存文件、日志文件等,如果都和源码放在一起就非常的乱,会影响到代码的阅读。
使用外部编译也可方便源码的管理。
既然有外部编译那么也就有内部编译(in-source-build),内部编译很好理解也就是在 CMakeList.txt 所在的目录存放产生的临时文件。
建议尽可能使用外部编译。
语法
基本语法
来看一下 CMAKE 的最小配置,在项目的根目录创建一个 CMakeLists.txt 文件,并把如下内容拷贝进去
|
|
CMAKE 的最小配置需要你设置 CMAKE 的最小版本号,为项目取一个名字,编译成可执行文件(或者库)并指定需要参与编译的源文件。
编写好了 CMakeLists.txt 就可以通过上一小节的知识进行构建了,但还需要准备一个 main.cpp 文件就行了。
设置变量
在 CMake 中设置变量的语法使用 set ,来看个例子
|
|
设置变量挺简单的,在使用的时候通过 ${} 来引用,我们可以用 message 来打印变量的值。
变量区分大小写
预定义变量
我们可以自己定义变量,系统也内置来一些变量来方便我们的使用
| 变量名 | 作用 |
|---|---|
| PROJECT_SOURCE_DIR | 项目的源代码所在的目录,最顶层的目录 |
| CMAKE_SOURCE_DIR | 项目的源代码所在的目录,也是最顶层目录 |
| CMAKE_CURRENT_SOURCE_DIR | 当前CMakeLists.txt所在的目录 |
| CMAKE_CURRENT_LIST_FILE | 当前CMakeLists.txt的完整路径 |
编译成可执行文件
把要源码编译成可执行文件只需要使用 add_executable 函数,并指定名字和要参与编译的源文件就行。
除此之外,我们还可以设置编译的类型为 Debug 还是 Release 。
|
|
除了在 CMakeLists.txt 中指定编译类型,还可以通过命令行来指定,如下所示
|
|
其中 -D 表示定义变量并赋值,可以理解为 definition
编译成库
在 Android 开发中,我们通常使用 C/C++ 来进行动态库的开发,而不是直接编译成可执行文件。来看个例子
|
|
编译成库文件使用 add_library 函数,需要指定库的名字并且要指定是动态库还是静态库,最后就是指定需要参与编译的源文件了。
添加第三方库
在平时的开发中难免会用到第三方库,我们来看一下怎么添加第三方库的依赖
|
|
添加第三方库和编译第三方库一样使用 add_library 函数,不一样的是第三库使用的是导入的形式,不需要使用源码再进行编译一遍。
不过第三方库需要指定 so 的位置,使用 set_target_properties 来指定导入路径这个属性。
最后还需要把第三方库链接到我们自己的库中,使用 target_link_libraries ,只需要把指定目标和要链接到目标的库就行。
添加头文件
在开发中我们常常会把头文件和源文件分开放,这样方便管理。分开放之后我们就需要告诉 CMake 去哪里查找头文件,通过 include_directories
|
|
include_directories 相当于 g++ 选项中的 -I 参数。
一次性添加所有源文件
之前使用 add_library 或者 add_executable 都是在变量里直接写源文件的路径,文件少还好,文件多了那简直是噩梦。如果不小心删掉了,或者增加来非常容易遗忘,所以在 CMake 中可以通过 AUX_SOURCE_DIRECTORY 来一次性把指定目录下的源文件存在一个变量中。
|
|
需要注意的是 aux_source_directory 不会遍历子目录
查找系统库
在做 Android 开发的时候, Android 系统本身也提供一些库,比如 log ,当我们需要的时候就可以直接使用,不需要再自己写一遍了。使用系统库的时候,先要查找一下在哪,通过 find_library
|
|