正点原子Ubuntu入门014---Makefile基本语法

发布时间 2023-07-27 15:47:45作者: 小李是菜鸟

一、Makefile规则格式

目标……:  依赖文件集合

(Tab键)命令1

(Tab键)命令2

(Tab键)命令3

……

 

 先判断依赖文件是否存在,存在才依次运行命令

 

main: main.o input.o calcu.o
    gcc -o main main.o input.o calcu.o
main.o: main.c
    gcc -c main.c
input.o: input.c
    gcc -c input.c
calcu.o: calcu.c
    gcc -c calcu.c

clean:
    rm *.o
    rm main

 

首先更新第一条规则中的 main,第一条规则的目标成为默认目标,只要默认目标更新了那么就认为 Makefile 的工作。

在第一次编译的时候由于 main 还不存在,因此第一条规则会执行,
第一条规则依赖于文件 main.oinput.o calcu.o 这个三个.o 文件,这三个.o 文件目前还都没有,因此必须先更新这三个文件。 make 会查找以这三个.o 文件为目标的规则并执行。

main.o为例,发现更新 main.o 的是第二条规则,因此会执行第二条规则,第二条规则里面的命令为“gcc–c main.c”,这行命令很熟悉了吧,就是不链接编译 main.c,生成 main.o,其它两个.o 文件同理。

 

因此Makefile工作流程是:

1make 命令会在当前目录下查找以 Makefile(makefile 其实也可以)命名的文件。
2、当找到 Makefile 文件以后就会按照 Makefile 中定义的规则去编译生成最终的目标文件。
3、当发现目标文件不存在,或者目标所依赖的文件比目标文件新(也就是最后修改时间比
目标文件晚)的话就会执行后面的命令来更新目标。

二、Makefile变量

#Makefile 变量的使用
objects = main.o input.o calcu.o
main: $(objects)
    gcc -o main $(objects)

 

  • Makefile注释用   “#”
  • 定义了一个变量   objects,变量引用用  $(变量名)

 

  • 等号  =
 name = zzk
 curname = $(name)
 name = zuozhongkai
 print:
     @echo curname: $(curname)
#如果最后一行不加@,就会将运行过程一起打印出来                     

 

 打印结果是最后一次的赋值

变量的真实值取决于它所引用变量的最后一次有效值

 

  • 赋值符  :=

就表示直接赋值,赋予当前位置的值

 

  • 赋值符  ?=

表示如果变量没有被赋值,就赋值等号后的内容,否则仍然是之前赋值的内容

 

  • 变量追加  +=

Makefile中的变量是字符串,+=就可以向变量中追加赋值

三、Makefile模式规则

%就是通配符

 

%.c:%.o

  gcc -c $<

 

  • 自动化变量

    $@

    表示目标集,“集”的意思就是组合,全部,有多个目标,$@就是目标集合。

    $^

    所有依赖目标的集合,注意,这里说的是“依赖”,也就是目标的组成元素。

   $<

    依赖目标中的第一个目标名字,也就是上面说的$^中的第一个元素。

 

  • 伪目标
  • 不管当前文件夹有没有与伪目标重名的文件,都会执行伪目标