本章目标:
学会在Android Studio中使用CMake工具编译C、C++项目代码,输出hello world, cpp
。
- C++编译流程
- C++编译器
- make命令
- CMake概念
- CMake应用
- AS JIN项目
- 学习资源
1. C++编译流程
C/C++源代码编译成库或可执行文件需要经过4个流程:预处理
、编译
、汇编
、链接
, 这4个流程都需要使用编译器
2. C++编译器
编译C++的编译器有很多种,其中最主要2种如下:
MSVC
:Window平台的编译器,Visual Studio自带的C/C++编译器gcc/g++
: 类Unix下的标准编译器,支持众多语言,支持交叉编译。默认不支持Windows,需要第三方移植才可用于Windows。(Mac已经自带这2个编译器)
3. make命令
我们使用g++
编译C++项目时,我们需要清楚每个文件的依赖顺序,然后进行编译,这样才能编译出库或可执行文件。* 但是,如果一个项目很多文件时,我们就很难直接使用g++
命令编译了,因为我们要清楚依赖关系。
这时,我们可以编写makefile
文件,makefile
关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
make是一个指令工具,编写好c++项目的makefile
文件后,执行make makefile
进行编译即可。
4. CMake概念
为什么需要CMake? 因为当C++工程很大时,项目拥有者需要管理各种依赖,管理各种命名,编写makefile文件将会十分困难。大工程的makefile文件往往只有编译专家和天神看得懂。于是,某个优秀的程序员看不下去了,创造了CMake。
4.1 CMake是什么
CMake是一个跨平台的安装(编译)工具, 可以用简单的配置语句
来描述所有平台的安装(编译过程)。Cmake 并不直接建构出最终的软件,而是产生标准的建构档
(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
4.2 CMake基本语法
CMake有很多基本语法,用来配置编译选项,以下为部分介绍
- 变量定义与消息打印
# 变量名为 var,值为 hello
set(var hello)
# 引用 var 变量
${var}
# 通过message打印信息
message(${var})
- 字符串操作
# 将字符串全部大写
string(TOUPPER ${var} result)
message(${result})
# 求字符串的长度
string(LENGTH ${var} num)
message(${num})
- 文件操作
# 文件重命名
file(RENAME "test.txt" "new.txt")
- 预定义的常量
CMAKE_CURRENT_SOURCE_DIR 指当前 CMake 文件所在的文件夹路径
CMAKE_SOURCE_DIR 指当前工程的 CMake 文件所在路径
CMAKE_CURRENT_LIST_FILE 指当前 CMake 文件的完整路径
PROJECT_SOURCE_DIR 指当前工程的路径
5. CMake应用
- 5.1 安装CMake和配置CMake环境变量
- 5.2 配置CMake工程
5.1 安装CMake和配置CMake环境变量
- 安装方式1: 去官网下载安装
- 安装方式2: 可通过Android Studio安装
安装完成后,可在sdk目录看到该工具, 然后将该路径配到环境变量中:
5.2 配置CMake工程
以下流程创建一个hello world项目
- (1) 新建一个工程文件夹,如CppTest
- (2) 在CppTest新建一个cpp文件,该文件打印hello world.
#include "iostream"
using namespace std;
int main() {
cout << "hello, world. cpp" << endl;
return 0;
}
- (3) 在 cpp 文件的同一目录下创建 CMakeLists.txt 文件,内容如下:
PROJECT(CppTest)
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
#使用AUX_SOURCE_DIRECTORY命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
- (4) 在 cpp 文件的同一目录下创建一个build目录,将工作目录切到build, 然后执行命令:
cmake ..
。执行完该命令后,将在build目录下面生成一堆编译后文件,包括Makefile
- (5) 在build目录下,执行指令:
make -f Makefile
。执行指令后,将生成可执行文件:main
- (6) 在build目录下,执行
./main
命令即可
6. AS JNI项目
目前Android Studio已经默认使用CMake方式编译so库,项目配置如下