一个Makefile的进化(一)
2018-08-10 本文已影响0人
stringlife
一个Makefile的进化(一)
隐含规则、变量与Makefile的显示
这一篇对开篇的Makefile进行修改
涉及Makefile的下面知识
变量
多个依赖
隐含规则
echo显示前的@
$@目标
涉及文件:
string@asus:~/Projects/makefile$ ls
Makefile test.c test_fun1.c
Makefile 文件如下:
OBJ = test.o
OBJ += test_fun1.o
all:test
@echo build all
test:$(OBJ)
gcc $(OBJ) -o $@
clean:
rm -f $(OBJ)
rm -f test
.PHONY : clean
这次文件依赖增加了一个源文件,来演示多个文件依赖
使用OBJ来替代每一个文件的中间文件
使用隐含规则生成.o文件
- 从Makefile已经可以看出来在Makefile中定一个变量是如此简单,直接变量名=变量值即可
- 变量可以进行+=操作,在使用的时候会展开为test.o test_fun1.o,
- 在Makefile中test依赖 test.o test_fun1.o,但是这两个目标并没有生成规则,系统是如何生成这两个文件呢,原来Makefile内建了很多隐含规则,在隐含规则中生成这两个目标的规则是:cc -c -o *.o *.c,所以会看到执行make后有下面的结果,至于要怎么样修改隐含规则,在后面的文章会讲到
- 在 all目标中有执行这语句 @echo build all,表示编译完成后进行显示信息,可以进行各种信息的显示,这里只做演示,echo前面的@表示不显示语句本身,如果没有@会多余的显示一行 echo build all,这个在实际的Makefile中经常使用,用于关闭打开make时候的信息
test:$(OBJ)
gcc $(OBJ) -o $$@
这个规则中$@是一个内建变量,特指在该语句中目标,在示例中表示test
执行make后如下结果
string@asus:~/Projects/makefile$ make
cc -c -o test.o test.c
cc -c -o test_fun1.o test_fun1.c
gcc test.o test_fun1.o -o test
build all
string@asus:~/Projects/makefile$ make clean
rm -f test.o test_fun1.o
rm -f test