一个Makefile的进化(一)

一个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文件

  1. 从Makefile已经可以看出来在Makefile中定一个变量是如此简单,直接变量名=变量值即可
  2. 变量可以进行+=操作,在使用的时候会展开为test.o test_fun1.o,
  3. 在Makefile中test依赖 test.o test_fun1.o,但是这两个目标并没有生成规则,系统是如何生成这两个文件呢,原来Makefile内建了很多隐含规则,在隐含规则中生成这两个目标的规则是:cc -c -o *.o *.c,所以会看到执行make后有下面的结果,至于要怎么样修改隐含规则,在后面的文章会讲到
  4. 在 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

你可能感兴趣的:(一个Makefile的进化(一))