做过Android平台开发的朋友对make
,mm
或make clean
命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系统的大门,探索一下这片未知的恐怖之森(问啥要用恐怖之森后面大家就知道了)。
Makefile入门
在讲解Android编译系统之前首先来了解一下什么是Makefile:
简单的说,Makefile提供了一种机制,让使用者可以有效的组织工作。
注意这里用的是“工作”而非“编译”,这是因为Makefile并不是用来完成编译工作的,它只是一种规则的执行者,而使用者用它来执行什么规则没有任何限制。如既可以用它来编译系统,也能用它备份文档或只是打印log。
既然它是用来执行规则的,那么我们就来看看Makefile的规则。
TARGET:PREREQUISITES
COMMANDS
注意:COMMANDS前面必须有一个TAB制表符
在Makefile的规则中TARGET是需要生成的目标文件,PREREQUISITES是目标的先决条件,也是另一个规则中的target。COMMANDS是生成目标文件的命令,当prerequisites中的任何一个文件比target文件要新的时候就会触发commands。commands的具体内容取决于使用者的需求,如调用gcc编译器。
下面我们用一个简单的例子说明一下Makefile规则的用法。
涉及到的文件如下:
文件名 | 描述 |
---|---|
mian.c | 主函数所在文件 |
test.h | 提供一个测试函数getNumber的声明 |
test.c | 提供getNumber的函数实现,用于返回一个值 |
Makefile | 我们的主角,用于编译整个例子 |
文件内容如下:
(1)test.h对getNumber进行声明。
int getNumber();
(2)test.c实现getNumber函数
#include "test.h"
int getNumber()
{
return 2333;
}
(3)main.c打印getNumber的返回值
#include <stdio.h>
#include "test.h"
int main()
{
printf("Hello,getNumber=%d\n",getNumber());
return 0;
}
(4)Makefile文件,用于组织这个小例子的编译工作
MakefileTest : main.o test.o
gcc -o MakefileTest main.o test.o
main.o : main.c
gcc -c main.c
test.o : test.c
gcc -c test.c
对上面这段代码简单解释一下,MakefileTest
为TAEGET即目标产物,main.o
和test.o
是MakefileTest
的先决条件。gcc -o MakefileTest main.o test.o则是MakefileTest对应的COMMANDS,这条命令使用gcc命令将main.o和test.o编译成MakefileTest可执行文件。
最后通过使用make命令就会在当前目录生成一个MakefileTest可执行文件,运行结果如下:
上面这个是一个非常简单的Makefile的示例,但“麻雀虽小,五脏俱全”&