Makefile 简单学习

一、Makefile 简介

Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。
注意 Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。

一个规则 两个函数 三个变量

规则:

语法规则

  目标 :依赖

    命令1

     命令2 

     .

     .

目标: 目标即要生成的文件。如果目标文件的更新时间晚于依赖文件的更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则重新编译并更新目标。

依赖:  即目标文件由哪些文件生成。如果依赖条件中存在不存在的依赖条件,则会寻找其它规则是否可以产生依赖条件。

 

    例如:规则一是生成目标 hello.out 需要使用到依赖条件 hello.o,但是 hello.o 不存在。则 Makefile 会寻找到一个生成 hello.o 的规则二并执行。

命令:即通过执行该命令,由依赖文件生成目标文件。

   注意每条命令前必须有且仅有一个 tab 保持缩进,这是语法要求。

TARGET:Makefile 文件默认只生成第一个目标文件即完成编译,但是我们可以通过 “TARGET” 指定需要生成的目标文件。

 实例:

 第一个依赖关系:目标文件 test  依赖文件 1.o 123.o 

 

 第二个依赖关系:目标文件 %.o  依赖文件 %.c    这里代表“%” 所有的.o 文件依赖于.c文件 

下面我们讲解其他内容:

 

 三个变量:

Makefile 中也有一些已经定义好的常用变量,这里介绍其中常用的3个。

 

 1.$@

  表示规则中的目标,例如 test /$(TARGET)

2.$<

  表示规则中的第一个依赖条件.

 

3. $^

  表示规则中的所有依赖条件.如果依赖条件只有一个$^ 和 $< 区别不大。

两个函数: 

1. wildcard
例如

SRC = $(wildcard ./*.c)

匹配目录下所有的 .c 文件,并将其赋值给 SRC 变量。

2. patsubst
pat 是 pattern 的缩写,subst 是 substring 的缩写。例如

OBJ = $(patsubst %.c, %.o, $(SRC))
这个函数有三个参数,意思是取出 SRC 中所有的值,然后将 “.c” 替换为 “.o”,最后赋值给 OBJ 变量。

 

伪目标 .PHONY

什么是伪目标?伪目标就是上面Makefile文件的clean就是伪目标,伪目标就是不对应实际的文件。但是,由于伪目标没有依赖体,所以它的命令是不会自动被make执行的,如果要编译执行这个目标体,那么只需 make clean,编译器就会编译执行clean的命令。但是,如果刚好有个名字叫做clean的文件存在,那么make就会发现它,但是clean没有依赖体,所以make就会认为clean已经是最新的文件从而不会执行其命令。为了处理这种情况,就需要使用特殊的目标体.PHONY。.PHONY的依赖体文件的含义和通常的一样,但是make不检查是否存在有文件名和依赖体中的一个名字相匹配的文件,而是直接执行与之相关的命令。

  

 

posted @ 2021-11-25 21:39  _promise  阅读(135)  评论(0编辑  收藏  举报