makefile相关

1.makefile简介

  linux下的makefile的作用就是四个字——“自动编译”。当整个项目完成之后,我们可以写一个makefile文件,输入make命令就能完成所有编译。

  make其实就是linux下自带的构建器,而构建的规则就写在makefile中,makefile规定了make执行的命令,如哪些文件先编译,哪些文件后编译等。

 

2.makefile文件的命名

命名为:makefile 或 Makefile

 

3.makefile中的规则

例:gcc a.c b.c c.c -o app

makefile中分为三部分:目标、依赖、命令

目标:依赖

(tab缩进)命令

app:a.c b.c c.c

  gcc a.c b.c c.c -o app

makefile中由一条或多条规则组成

 

4.makefile的编写

第一个版本:

 

 

 缺点:效率低,修改一个文件,所有文件都会被重新编译

 

第二个版本:

 

 

 工作原理:

  检测依赖是否存在:

    若依赖不存在,则向下搜索规则,查看是否有规则,用来生成缺少的依赖,并执行规则中的命令

  依赖存在:

    若依赖存在,则判断依赖是否需要更新。原则:目标生成时间 > 依赖生成或修改时间(即目标的生成时间要晚于依赖的生成或修改时间),反之则更新

缺点:冗余

 

第三个版本:

通过makefile中的变量是制定规则,去除冗余的部分

makefile中的变量:

  自定义变量:

    例:obj = a.o b.o c.o  obj = 10

    变量的取值:aa = $(obj)

  makefile自带变量:大写

    CPPFLAGS

    CC

  自动变量:只能在规则的命令中使用

    $@:规则中的目标

    $<:规则中第一个依赖

    $^:规则中的所有依赖

 

 

 模式匹配:

  %是一个匹配符,第一个%和第二个%匹配的内容是相同的

  流程:

    开始时,搜索到main.o这个依赖文件不存在,向下搜索规则。%匹配到main,向下执行gcc -c $< -o $@命令,生成main.o依赖。

    同理,搜索到后面的add.o,sub.o,mul.o依赖文件不存在,向下搜索规则并执行规则中的命令,生成依赖文件。

缺点:可移植性差

 

第四个版本:

通过makefile中的函数来实现(makefile中的函数都有返回值)

 

 

 

 wildcard:查找指定目录下的指定类型的文件

  例:src = $(wildcard ./*.c)

  查找当前目录下所有.c文件

patsubst:匹配替换

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

  将src中所有的.c格式的文件替换成.o格式的文件

缺点:不能清理项目

 

第五个版本:

编写一个清理项目的规则

例:

  clean:

    -rm *.o app -f

声明伪目标:防止同个目录下有与clean同名的文件或文件夹

  PHONY:clean

-f:强制执行

命令前加 - :忽略执行失败的命令,继续向下执行其余的命令

执行清理命令:make clean

执行不是终极目标(makefile中第一个目标名)的目标:make 目标名

 

posted @ 2021-02-10 16:44  さくらむすび  阅读(73)  评论(0)    收藏  举报