ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Makefile进阶

2021-09-09 18:02:11  阅读:201  来源: 互联网

标签:%. OBJ 进阶 cc Makefile include TARGETS


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)

标签:%.,OBJ,进阶,cc,Makefile,include,TARGETS
来源: https://blog.csdn.net/qq_38933606/article/details/120199378

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有