一个工程源文件不计其数,按功能,模块分别置于不同的目录中,makefile定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。
好处:
自动化编译,一旦写好,只需nake命令,整个工程自动编译,极大提高了软件开发效率。
实例:
test.c
#include <stdio.h>
int main()
{
printf("hello makefile\n");
}
makefile文件
1
2
3 test : test.o
4 gcc test.o -o test
5 test.o : test.s
6 gcc -c test.s -o test.o
7 test.s : test.i
8 gcc -S test.i -o test.s
9 test.i : test.c
10 gcc -E test.c -o test.i
11
12 .PHONY:clean
13 clean:
14 rm -f test.i test.s test.o test
执行make指令结果为:
makefile文件编写规则:
目标文件 : 依赖文件
gcc -c test.c -o test.o(tab键)
注意:
make //只执行第一个
$^ 代表所有的依赖文件
$@ 代表所有的目标文件
$< 代表第一个依赖文件
@指令 执行时不显示该指令
定义变量: 大写
变量名=值1 值2....
使用变量 $(变量名)
.PHONY:clean 生成伪目标,不比较时间先后,定会执行指令
改写后的文件如下:
1 OBJS= test.o
2
3 test: $(OBJS)
4 @gcc -g $^ -o $@
5 @echo $(OBJS)
6 %.o : %.c
7 @gcc -c -g $< -o $@
8
9
10 clean:
11 rm -rf $(OBJS)
那么make是如何工作的?
- 在当前目录下查找Makefile文件。
- 若找到,找文件中的第一个目标文件,将其作为最终的目标文件。
- 如果test文件不存在,或test所依赖的test.o文件修改时间比test文件新,则可用touch测试。
- 若test所依赖的文件test.o不存在,make会根据当前依赖关系生成test.o文件。
- make只管文件的依赖性
- 在找寻过程中,若出错,直接退出,并报错