Makefile进阶

本文介绍了Makefile中的依赖关系,当源文件变更时,make会自动重新编译。通过include命令,可以复用Makefile内容。此外,展示了如何处理头文件变更,通过预处理程序生成依赖性,确保头文件变动时也能触发编译。

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

1、Makefile依赖关系

SRC     := $(wildcard *.c)
OBJ     := $(SRC:.c=.o)
$(TARGETS) : $(OBJ)
	cc $^ -o $@
%.o : %.c
	cc -c $<

在上记的Makefile中,%.o : %.c 规则并没有被显式调用。但是在执行 $(TARGETS) : $(OBJ) 时,
Makefile会根据$(TARGETS) : $(OBJ)%.o : %.c生成以下的依赖树:

$(TARGETS) <= $(OBJ) <= %.c

因此,当任意源文件发生变更时,make都会重新编译和链接发生变更的文件。

2、include

在实际的应用中,为了复用已有的Makefile,经常会使用include命令,将其它Makefile文件的内容包含到当前Makefile中。
1)将以下Makefile作为共同文件,放在外层目录
file:Makefile.common.mk

SRC     := $(wildcard *.c)
OBJ     := $(SRC:.cpp=.o)
$(TARGETS) : $(OBJ)
	cc $^ -o $@
%.o : %.c
	cc -c $<

2)编写具体的Makefile文件
file:Makefile

TARGETS = test
include ../Makefile.common.mk

3)扩展
当include指定的文件不存时,Makefile同样会在所有目标中查找是否存在include指定对象的目标;
若目标不存在,则发生错误;否则,执行对应的目标规则。
因此,我们可以将不会自动推导的依赖项作为include命令的对象,让目标可以自动编译。

4)实际应用
在前述的Makefile中,都只有对源文件的目标规则。当只有头文件方式更改时,Makefile无法自动检测到代码变更,也不会重新编译。

SRC     := $(wildcard *.c)
OBJ     := $(SRC:.c=.o)
$(TARGETS) : $(OBJ)
	cc $^ -o $@
%.o : %.c
	cc -c $<

DEPEND	:= $(SRC:.d=.o)
%.d : %.c
####  对指定的程序运行预处理程序,同时请求预处理程序生成 makefile 依赖性并将结果重定向到临时文件(目标文件.进程号)
	cc -M $< > $@.$$$$;		\
####  通过sed命令将临时文件中类似test.o : test.h的行,替换为test.o test.d : test.h
####  再通过egrep去除标准库头文件,并重定向到.d文件中
	sed 's,\($*\).o[ :],\1.o $@ : ,g' < $@.$$$$ | egrep -v ':[ ]*(/usr/|/opt/)' > $@;	\
####  删除临时文件
	rm -f $@.$$$$		

inlcude $(DEPEND)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值