注:以下学习内容学习于韦东山老师arm裸机第一期教程
一.Makefile的引入及规则
1.1 在keil,mdk,avr等工具开发程序时点点鼠标就可以编译了,他的内部机制就是使用Makefile来组织管理程序,决定编译哪一个文件.
1.2 如下例:
a.c文件
#include<stdio.h>
int main()
{
func_b();
return 0;
}
b.c文件
#include <stdio.h>
void func_b()
{
printf("This is func_b!\n");
}
将两个文件上传到Linux服务器用gcc进行编译
gcc -o test a.c b.c
执行生成的test程序,成功打印出了This is func_b!
对于gcc -o test a.c b.c命令
a.具体流程: 对a.c执行预处理、编译、汇编、得到a.o
对b.c执行预处理、编译、汇编、得到b.o
最后将a.o b.o链接起来得到test应用程序
b.这条命令在每次执行时都会对a.c,b.c进行重新处理,及时没有经过修改也会进行一次处理过程(当文件很多时就会使得效率低下)
目的:只对被修改的文件进行重新编译,那么如何知道哪个文件被修改了?
方法:比较 a.o与a.c的时间,如果不同说明a.c被修改
比较 b.o与b.c的时间,如果不同说明b.c被修改
比较 a.o、b.o与test的时间,如果不同需要重新生成test
1.3 Makefile的基本语法规则
目标文件:依赖文件1,2.....
(tab键) :命令
当依赖比目标新,或者目标不存在时执行命令
编写Makefile如下
test:a.o b.o
gcc -o test a.o b.o、b
a.o:a.c
gcc -c -o a.o a.c
b.o:b.c
gcc -c -o b.o b.c
编译程序时直接执行make命令即可,只会编译被修改的文件.
直接执行make,如下,两个文件都被编译
book@www.100ask.org:/work/arm9/hareware/5.Makefile/001.test_app$ make
gcc -c -o a.o a.c
gcc -c -o b.o b.c
gcc -o test a.o b.o
修改a.c文件之后再次执行make,如下,只对a.c进行了编译
book@www.100ask.org:/work/arm9/hareware/5.Makefile/001.test_app$ make
gcc -c -o a.o a.c
gcc -o test a.o b.o
二.Makefile语法
2.1 通配符%.o, $@, $<, $^
在上面的Makefile中,
test:a.o b.o
gcc -o test a.o b.o
a.o:a.c
gcc -c -o a.o a.c
b.o:b.c
gcc -c -o b.o b.c
如果有很多很多.c文件,难道要一个个写吗?
因此引入通配符
test:a.o b.o
gcc -o test $^
%.o:%.c
gcc -c -o $@ $<
$@表示目标文件,$<表示第一个依赖文件,&^表示所有的依赖
如果要添加一个c.c文件,直接在b.o后面添加一个c.o即可,如下:
test:a.o b.o c.o
gcc -o test $^
%.o:%.c
gcc -c -o $@ $<
2.2 假象目标
2.2.1 假设想要清除文件,修改Makefile如下
test:a.o b.o c.o
gcc -o test $^
%.o:%.c
gcc -c -o $@ $<
clean:
rm *.o test</