精简的makefile示例分析

1 make

  make 是Linux自带的构建器,构建的规则在makefile文件中

2 makefile文件名

  makefile 或 Makefile

3 makefile中的规则

  • makefile的规则有三部分:目标,依赖,命令;
  • makefile有一条或多条规则组成;
  • 第一个目标是makefile的终极目标;
  • 用 # 添加注释。

-------------------------------------------------------------------------

  目标:依赖
  (tab缩进) 命令

     gcc a.c b.c c.c -o app 改为makefile文件如下:

      

 

 4 makefile的编写

    工作原理:依赖不存在,就向下搜索下面的规则,如果找到用来生成查找依赖的规则,就执行规则中的命令;依赖存在,就判断是否需要更新

    第一版:改为多条规则如下,可以实现只有修改的文件才重新编译。

            

 

     第二版:使用自定义变量,减少冗余

            

    a.自定义变量:

      obj=a.o b.o c.o

      obj=10

     b.变量的取值:

      aa=$(obj)

    c. makefile自带的变量:大写

      CPPFLAGS

      CC

    d. 自动变量:只能在命令中使用

      $@  :  规则中的目标

      $<  :  规则中的第一个依赖

      $^  :  规则中的所有依赖

    e. 模式匹配:

      %.o:%.c

  第三版:全部改为自定变量。

          

  第四版:使用函数,实现makefile文件在不同的项目中通用。makefile所有的函数都有返回值

     

     a.  查找指定目录下指定类型的文件

        src=$(wildcard ./*.c)

     b. 匹配替换

        obj=$(patsubst %.c, %.o, $(src))

  第五版:添加清理项目功能。只需要添加一个新的规则:clean即可,注意:clean应该名声为伪目标。

     

    a. 使用.PHONY声明伪目标,如果clean不声明为伪目标,并且目录下有一个文件名为clean的文件,那么make clean就永远不会执行。

    b. rm命令前面添加一个 - 号,表示命令执行失败时,继续向下执行。

src=$(wildcard ./*.c)
obj=$(patsubst %.c, %.o, $(src))
target=app

$(target):$(obj)
        gcc $^ -o $@
%.o:%.c
        gcc -c $< -o $@

.PHONY:clean
clean:
        -rm $(obj) $(target) -f

 

posted @ 2020-03-28 16:37  ziwuxian  阅读(260)  评论(0编辑  收藏  举报