Linux->make/makefile

make/makefile简介

makefile: 普通文本文件,记录了项目的构建流程规则
make:一个解释程序,到当前执行make命令的目录下寻找makefile文件,并且对makefile中记录的项目构建进行解释执行

makefile的编写规则

  • makefile的编写是有固定规则的,而不是随意的编写,下面举例说明。
    Linux->make/makefile
  • 编写规则需要注意一下几点:
    • 第一句的格式必须是【目标对象】:【依赖对象】
      • 依赖对象:后面的操作的对象
      • 目标对象:执行操作命令后生成的对象(文件)
        *第二句:【Tab】【执行的操作】,注意这里的Tab制表符不能是四个空格

make的执行规则

  • make解释执行时,只会寻找第一个目标对象并执行其对应的操作

Linux->make/makefile
这样编写makefile,执行make后只会生成main,不会生成main2

  • make执行的几个步骤(系统自行执行,用户看不到)
    • 若目标对象不存在:执行命令操作,生成目标对象
    • 若目标对象已存在:判断是否有依赖对象
      • 没有依赖对象:报错,不需要重新生成
      • 有依赖对象:判断依赖对象是否存在
        • 依赖对象存在:通过目标对象和依赖对象的最后一次修改时间判断是否需要重新执行下面的命令操作
        • 依赖对象不存在(makefile所在目录没有依赖对象(文件)):make继续子啊makefile中寻找依赖对象的生成规则,进而生成目标对象,根据这个规则,如果相同时生成main和main2,可以这样写:
          Linux->make/makefile
          将main和main2作为All的依赖对象,make就会继续寻找main和main2的生成规则并且执行对应的操作。

编写技巧

三个预定义变量

  • [email protected]:目标对象
  • $^:所有依赖对象
  • $<:依赖对象中的第一个

于是Makefile可以改成如下:
Linux->make/makefile

上面的例子中目标对象的依赖对象都只有一个,可以用$^,也可以用$<。

d* %:通配符,关于%的用法,下文会举例说明
下面我们用%再次简化makefile:
这次我们用一个稍复杂的例子说明,这是根据上面的介绍写出的makefile:
Linux->make/makefile

有关gcc的用法参考:linux->gcc

用%通配符简化后:
Linux->make/makefile
可以看出,如果对许多某一类型的对象有同样的操作,用%代表每一个以 .o(这里以 .o为例)结尾的文件,可以大大简化代码的篇幅。

三个关键字

  • wildcard :获取指定文件名
  • patsubst :字符串替换

Linux->make/makefile

  • .PHONY (大写):用于伪对象声明,不管目标对象是否存在,是否最新,每次都重新生成
    Linux->make/makefile
    只要输入命令make clean不管文件是否最新,rm $(obj) main main2都会执行,make clean可以指定make的操作对象,make会直接在makefile中搜索clean对象并执行它对应的命令。