美文网首页Android-NDK/JNI我爱编程
《NDK项目构建-Cmake和Mackefile的编译实践》

《NDK项目构建-Cmake和Mackefile的编译实践》

作者: Oneminute | 来源:发表于2018-04-15 15:55 被阅读71次

背景:

在NDK的开发当中,编译是少不了的,以android studio中的NDK项目为例,除了在cpp下放置c/c++文件和头文件,最为重要的就是配置编译的规则了,当在编译apk时,会根据配置的编译规则将C或者C++源文件生成对应的so动态链接库,最终集成到apk中,编译的配置就在CMakeLists.txt中。


图片1-1(NDK项目)

1.编译的过程

在了解配置语法之前,很有必要了解一下编译的整个过程。

在PC上运行的是一个二进制的程序,一个java源文件,PC是运行不了的,只有编译成.class文件才可执行。同样C、C++源文件也是需要通过编译
才可被计算机运行,一个正常的编译过程包含三个步骤:编译打包链接,所对应的工具就是编译器、打包器和链接器。

  • 编译:gcc

  • 打包 :ar

  • 链接:g++

2.手动编译和自动编译

2.1手动编译

手动编译就是手写编译命令并执行生成对应的文件。一个C或C++源文件在编译开始前首先要生成它所对应的中间文件,在windows平台下中间文件是.obj文件,在Linux平台下生成的中间文件是.o文件,下面就在Linux平台下通过g++指令来生成一个中间文件。

首先准备几个c文件放到Linux系统mdke文件下。

图2-1(Linux文件目录)

命令行输入gcc -c main.c.执行后便生成了一个main.o的中间文件。

图片.png

接下来依次用gcc编译divi.c、plus.c...等所有的源文件,手动编译只是为了知道最底层的编译过程,每个文件都是通过一行一行的指令执行生成对应的文件,除了gcc指令外,还有其他指令,这些指令我们不需要深究,只知道由这些指令可以生成我们所需要的动态链接库,而且原文件在非常多的情况下,手动编译肯定会玩疯的,如何配置编译文件,让其自动编译,是接下的重点内容。

2.2自动编译-makefile

配置编译文件,让其自动编译,我们需要了解一个非常重要的概念makefile。

什么是makefile?
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile配置好后,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。但是makefile的构建语法不是通用的,也就是说不同编译环境下,makefile有所不同。例如Visual C++的nmake,Linux下GNU的make。android 是基于Linux系统的,so,我们只需要关注GNUmake。

Makefile

执行“make”

make

可以看到生成了每个C文件对应的中间文件,并且还生成可运行的myc文件。


生成中间文件

关于Mackefile的语法不是本文的重点,而且Mackefile的语法非常丰富,有需要的可以参考这个PDF文件


下载地址:https://pan.baidu.com/s/1Mr-LjvxI2lesa7TzL4l-ow

以上,简单了解了编译的过程,以及如果用指令生成一个中间文件,知道了通过配置Makefile文件自动编译生成中间文件,其实Makefile本质上也是通过gcc指令去生成中间文件的,它根据配置规则自动的执行相关的指令而已。笔者参考了GNU_Make手册,但本文没有对它的语法内容展开,因为内容丰富,绝大部分配置没有亲手尝试实践,而且没有结合项目,单纯说语法会显得晦涩难懂,另外Makefile并不夸平台,不深入了解Makefile的原因还在有一个更为简单易懂的构建方式——Cmake

2.3 Cmake

CMake是一个跨平台的、开源的构建工具。cmake是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。NDK项目采用的就是CMake构建方式,Cmake会帮助我们生成makefile文件,笔者根据自己的理解给出如下的关系图。

Cmake官网

Cmake手册

具体的语法看Cmake手册足够了

相关文章

网友评论

本文标题:《NDK项目构建-Cmake和Mackefile的编译实践》

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