关于《跟我一起写 Makefile》读书笔记整理(一)

本文深入讲解Makefile的书写规则,包括依赖关系与生成方法、通配符应用、文件搜寻策略、伪目标与多目标规则,以及静态模式的定义。通过实例演示如何高效管理大型项目中的源文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【说明:本文是对于《跟我一起写Makefile》自我总结,原作者:陈皓】
【参考链接】https://seisman.github.io/how-to-write-makefile/index.html

Makefile 书写规则

一、 规则包含两个部分:一是:依赖关系;二是:生成目标的方法

二、 规则的语法
(1) targets : prerequisites
(2)(Tab键开头) command
(3) #如果命令太长可以使用 ’ \ ',作为换行符

三、在规则中使用通配符
(1)make支持三个通配符:“*”、“ ? ” “ […] ”
(2)举例说明

//例一
clean:
rm -f *.o

//例二
//目标test依赖于所有的【.c】文件
test:*.c  

//例三
//不是说【*.o】会展开,objects的值就是“*.o”
objects = *.o 	

//例四
//1.如果你要让通配符在变量中展开,也就是让 objects 的值是所有[.o]的文件名的集合
//2.利用关键字“wildcard”指出
objects := $(wildcard *.o)

四、文件搜寻
(1)在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。
(2)Makefile 文件中的特殊变量“VPATH”就是完成这个功能(方式一)
(3)若没有指明这个变量,make 只会在当前的目录去找寻依赖文件和目标文件。
(4)若定义了这个变量,那么make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。

/* 不同目录之间由 “冒号” 分隔(搜索的最高优先级永远都是当前目录)
 * 【src】和 【../header】,make会按照这个顺序进行搜索
 */
VPATH = src:../headers   --- 方式一

(5) 方式二:设置文件搜索路径的方法是使用 make 的“vpath”关键字【注意,它是全小写的,是一个关键字】,它可以指定不同的文件在不同的搜索目录中。使用上比VPATH灵活。它的使用方法有三种:

1、vpath <pattern> <directories> 
// 为符合模式<pattern>的文件指定搜索目录<directories> 
2、vpath <pattern> 
// 清除符合模式<pattern>的文件的搜索目录
3、vpath 
// 清除所有已被设置好了的文件搜索目录

(6) vpath 使用方法中的需要包含“%”字符
(7) “%”的意思是匹配零或若干字符
(8) 例如,“%.h”表示所有以“.h”结尾的文件
(9) 指定了要搜索的文件集
(10)则指定了的文件集的搜索的目录

//要求make在【../headers】目录下搜索所有【*.h】结尾的文件
vpath %.h ../headers   ---方式二

五、伪目标(是一个标签,不是文件)
(1)伪目标取名不能和文件名重名
(2)为了避免重名,可以使用一个特殊标记【.PHOUY】,指明这是伪目标
(3)整个过程书写方式

.PHOUY:clean
clean:
	rm -f *.o test 

六、多目标
(1)Makefile 的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件
(2)多个目标的生成规则的执行命令是同一个,可以通过使用
(3)一个自动化变量“$@” — 表示目标的集合,像一个数组一样

七、静态模式可以更容易定义多目标的规则
(1)语法

<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
......

(2)举例

// 【$<】 表示所有的依赖目标集(也就是“foo.c bar.c”)
// 【$@】表示目标集(也就是“foo.o bar.o”)
objects = foo.o bar.o
all: $(objects)
$(objects): %.o:%.c
	$(CC) -c  $(CFLAGS) $< -o $@
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值