背景:
在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。
执行“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手册足够了
网友评论