除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令,为了编译的简单可行,makefile由此而生,在编译时候直接输入make便会按照makefile里面的规则编译源代码。Android的源代码就是通过makefile管理的。
make的工作原理
make通过makefile得到编译规则,从而编译源文件
makefile是以一个文本形式的脚本告诉make编译器如何以及怎么编译源代码,里面包含了编译规则
makefile规则遵循以下通用格式1
target:dependency [dependency[···]]
    command
    command
    [···]
每个command第一个字符必须是tab键,而不是空格键,不然make会报错并停止
makefile的使用
makefile的简单使用
makefile的文件名必须为makefile或者Makefile
如果要用其他名称,使用make -f filename
编写makefile文件如下所示,便可以通过make命令编译test.c文件了1
2start:
gcc -o test test.c进一步使用makefile
1
start:test.o gcc -o test test.o test.o: gcc -o test.o -c test.c
说明:target start后面的test.o代表其下的command依赖与test.o这个target。所以make先执行了test.o这个target下的command,如果存在test.o,那么makefile会去查看.c文件的修改时间,再决定编不编译.c文件
- makefile完善
1
2
3
4
5
6start:test.o
gcc -o test test.o
test.o:
gcc -o test.o -c test.c
clean:
rm -f test.o 
说明:增加clean标签,其后面的指令会在输入make clean时候执行
在makefile中执行shell命令
1
2
3
4
5
6
7start:test.o
gcc -o test test.o
@echo '----------ok----------'
test.o:
gcc -o test.o -c test.c
clean:
rm -f test.o简化makefile
为了简化编辑和维护makefile,可以在makefile中使用变量1
varname=some_text
把变量用括号括起来,前面加$就可以引用该变量的值1
$(varname)
按照惯例makefile的变量都是大写(只是习惯而已,不是必须的)1
2
3
4
5
6
7
8
9
10
11
12CC=gcc
SRCS=test.c
OBJS=test.o
EXEC=test
start:test.o
    $(CC) -o $(EXEC) $(OBJS)
    @echo '----------ok----------'
$(OBJS):
    $(CC) -o $(OBJS) -c $(SRCS)
clean:
    rm -f $(OBJS)
OBJS可以简化为以下形式,相当于把.c替换为.o1
OBJS=$(SRCS:.c=.o)
- makefile完整版
1
2
3
4
5
6
7
8
9
10
11
12
13
14.SUFFIXES:.c .o
CC=gcc
SRCS=test.c
OBJS=$(SRCS:.c=.o)
EXEC=test
start:test.o
$(CC) -o $(EXEC) $(OBJS)
@echo '----------ok----------'
.c.o:
$(CC) -o $@ -c $<
clean:
rm -f $(OBJS) 
模式规则
.SUFFIXES:.c .o
表示任何x.c文件与x.o关联,make定义了一条规则,任何x.o文件都从 x.c编译而来
.c.o
make定义了一些有用的预定义变量
| 变量名 | 含 义 | 
|---|---|
$@ | 
规则的目标所对应的文件名 | 
$< | 
规则中的第一个相关文件名 | 
- makefile同时编译多个源文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16.SUFFIXES:.c .o
CC=gcc
SRCS=test.c \
a.c
OBJS=$(SRCS:.c=.o)
EXEC=test
start:test.o
$(CC) -o $(EXEC) $(OBJS)
@echo '----------ok----------'
.c.o:
$(CC) -o $@ -c $<
clean:
rm -f $(OBJS) 
常见的make出错信息
No rule to make target ‘target’.Stop
makefile中没有包含创建指定target所需要的规则,而且也没有默认规则可用‘target’ is up to date
指定的target相关文件没有变化command:Command not found
make找不到命令,通常是因为命令被拼写错误或者不在$PATH路径下