makefile入门

一、Makefile

Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。

当源代码文件数目较多,并且目录结构关系复杂时,需要通过
makefile来编写程序的编译规则,也就是程序的编译顺序,整合起来,来编译代码

注意 Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。

二、1个规则
1. 语法规则
在这里插入图片描述
2. 目标
目标即要生成的文件。如果目标文件的更新时间晚于依赖文件的更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则重新编译并更新目标。

3. 依赖
即目标文件由哪些文件生成。如果依赖条件中存在不存在的依赖条件,则会寻找其它规则是否可以产生依赖条件。(冒号前的文件都是由冒号后的文件通过冒号下一行的命令产生的)

4. 命令
即通过执行该命令,由依赖文件生成目标文件。
注意每条命令前必须有且仅有一个 tab 保持缩进,这是语法要求。

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

6. 示例
写一个child.h文件和child.c文件
child.h
在这里插入图片描述
child.c
在这里插入图片描述
然后写一个main.c文件
在这里插入图片描述
然后写一个makefile
在这里插入图片描述
然后编译执行,输入make执行
三、2个函数

1. wildcard
例如 :SRC = $(wildcard ./*.c)
匹配目录下所有的 .c 文件,并将其赋值给 SRC 变量。

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

3. 示例
通过上面两个函数,假如我们目录下有很多个 “.c” 后缀的源文件,就不需要写很多条规则语句了,而是可以像下面这样写


这里我们先将所有的 “.c” 文件编译为 “.o” 文件,这样后面更改某个 “.c” 文件时,其它的 “.c” 文件将不再编译,而只是编译有更改的 “.c” 文件,可以大大节约大项目中的编译速度。

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

1. $@
表示规则中目标,代表目标文件 。例如 text,main.o,child.o。

2. $<
表示规则中的第一个依赖条件,

3. $^
表示规则中的所有依赖条件.
注意:如果只有一个依赖条件,这种情况下 $^ 和 $ < 区别不大。如果有多个依赖条件,那么 $ <只是表示第一个依赖条件而$^表示全部的依赖条件。
4.实例
在这里插入图片描述
1,4,7行的冒号前的文件,都可以在他们下面一行的命令里用 $@代替。
1,4,7行冒号后的都是依赖文件,像4,7行只有一个依赖文件,所以能用 $<代替,而第1行就不行,如果用 $<代替,那么只表示main.o,所以得用 $^来代替,表示第一行全部的依赖文件

五、其它常用功能

1. 代码清理 clean
我们可以编译一条属于自己的 clean 语句,来清理 make 命令所产生的所有文件。
在这里插入图片描述

这样我们就可以使用 clean 命令来清理生成的文件了:
这个clean命令的意思是清除text文件下的所有的.o文件

2. 伪目标 .PHONY
上面我们写了一个 clean 语句,使得我们执行 “make clean” 命令的时候,可以清理我们生成的文件。

但是假如当前目录下还存在一个文件名为 clean 的文件,那么我们再执行 “make clean” 命令的时候就只是显示在这里插入图片描述
解决方法就是我们使用伪目标,这样就可以避免出现上面的问题了,例如:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值