@cyysu
2017-10-18T08:42:06.000000Z
字数 2428
阅读 1144
- 时间:2017年10月10日
- 作者:Kali
- 邮箱:cyysu.github.io@gmail.com
- 版本:3.0
- 描述:主要介绍Makefile基础知识
Makefile系列教程
在Makefile中,最重要的三个概念是:> 目标(target) : 指的是要干什么,运行make之后生成什么> 依赖(dependency) : 指的是目标所依赖的其他目标> 命令(command) : 指的是make如何生成目标下面就让我们看一下Makefile的规则target ... : prerequisites ...command......# 我们举一些栗子来说明上面的格式mj@DZ:~/桌面/makefile/my$ lsMakefilemj@DZ:~/桌面/makefile/my$ cat Makefileall:echo "Hello Makefile"mj@DZ:~/桌面/makefile/my$ makeecho "Hello Makefile"Hello Makefile# 我们可以看到我们输入了我们填写的内容,下面我们继续修改我们的Makefilemj@DZ:~/桌面/makefile/my$ cat Makefileall:echo "Hello Makefile"test:echo "we can learn makefile!"mj@DZ:~/桌面/makefile/my$ makeecho "Hello Makefile"Hello Makefilemj@DZ:~/桌面/makefile/my$# 我们明明增加了一个test目标,为什么只生成了all目标,而没有生成test目标,这个时什么原因呢?# 这个就是Makefile的一个知识点了,它虽然允许你定义多个目标,但是它还没有智能到生成全部目标,默认时执行第一个目标,那么我们怎么同时生成多个目标呢?请看下面栗子。mj@DZ:~/桌面/makefile/my$ cat Makefileall: testecho "Hello Makefile"test:echo "we can learn makefile!"mj@DZ:~/桌面/makefile/my$ makeecho "we can learn makefile!"we can learn makefile!echo "Hello Makefile"Hello Makefile# 这样我们就可以生成多个目标了,解释一下上面的栗子,我们首先定义了一个all目标,这个all目标依赖于test,所以在生成all目标前首先会构建test目标,所以就看到了先打印test目标的内容,我们可以发现Makefile同时回显了我们的命令,这个怎么去掉呢?我们只要在我们的命令前面加上@就可以解决这个问题。mj@DZ:~/桌面/makefile/my$ cat Makefileall: test@echo "Hello Makefile"test:@echo "we can learn makefile!"mj@DZ:~/桌面/makefile/my$ makewe can learn makefile!Hello Makefile# 如果我们想执行某一个目标时我们应该怎么做呢?只需要在make后面跟上目标的名字即可mj@DZ:~/桌面/makefile/my$ cat Makefileall: test@echo "Hello Makefile"test:@echo "we can learn makefile!"clean:@echo "clean goal"mj@DZ:~/桌面/makefile/my$ make cleanclean goal
# test.c#include <stdio.h>void foo(){printf("foo() function test makefile\n");}# main.c#include <stdio.h>extern void foo();int main(){foo();return 0;}# Makefileall: main.o foo.ogcc -o main main.o foo.omain.o: main.cgcc -o main.o -c main.cfoo.o: test.cgcc -o foo.o -c test.cclean:rm -rf main main.o foo.o# 执行效果mj@DZ:~/桌面/makefile/my$ lsmain.c Makefile test.cmj@DZ:~/桌面/makefile/my$ makegcc -o main.o -c main.cgcc -o foo.o -c test.cgcc -o main main.o foo.omj@DZ:~/桌面/makefile/my$ lsfoo.o main main.c main.o Makefile test.cmj@DZ:~/桌面/makefile/my$ ./mainfoo() function test makefile# 到现在为止,你可以写多个文件之间的依赖了,写好Makefile可以提高编译速度,可以发现我们上面的Makefile中依赖关系中有太多的重复了,下面我们简化一下我们的makefilemj@DZ:~/桌面/makefile/my$ cat MakefileCC = gccRM = rm -rfEXE = mainobjs = main.o foo.o$(EXE): $(objs)$(CC) -o $@ $^foo.o: test.c$(CC) -o $@ -c $<clean:$(RM) $(EXE) *.omj@DZ:~/桌面/makefile/my$ makegcc -c -o main.o main.cgcc -o foo.o -c test.cgcc -o main main.o foo.omj@DZ:~/桌面/makefile/my$ ./mainfoo() function test makefilemj@DZ:~/桌面/makefile/my$

支付宝 微信