美文网首页Makefile
一个Makefile的进化(一)

一个Makefile的进化(一)

作者: stringlife | 来源:发表于2018-08-10 15:37 被阅读0次

    一个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的进化(一)

        本文链接:https://www.haomeiwen.com/subject/krakbftx.html