make自动生成依赖文件的两种形式

本文涉及的产品
文档翻译,文档翻译 1千页
图片翻译,图片翻译 100张
语种识别,语种识别 100万字符
简介: 最近编译源文件发现当修改头文件后,make并不会自动把包含此头文件的所有源文件重新编译,而每次都是需要把对应的中间文件清除才能重新编译,非常的麻烦。因此需要make自动对源文件所依赖的头文件进行管理,即make自动生成依赖文件。
最近编译源文件发现当修改头文件后,make并不会自动把包含此头文件的所有源文件重新编译,而每次都是需要把对应的中间文件清除才能重新编译,非常的麻烦。因此需要make自动对源文件所依赖的头文件进行管理,即make自动生成依赖文件。鉴于本人的刚开始写的博客,很多方面经验不足,比如如何介绍我所用到的知识等,现在只是对我在过程中遇到的问题进行记录,相关的知识可以查看gnu make中文文档,上网等等。
遇到的问题记录如下:1、make在生成依赖文件后并不正确:原因是生成的依赖文件中的目标文件(.d与.o)并不与所要的编译的源文件对应(一个在当前目录,一个在子目录下),对makefile的依赖文件的生成规则进行了查看,发现是使用了gcc -MM默认的生成方式,于是想到看有没有指定的依赖目标的生成规则。于是在网上搜索看到了这么一个帖子(http://bbs.chinaunix.net/thread-930718-1-1.html):楼主的问题是:
gcc -M生成依赖关系的时候,默认的形式是:
xxx.o: xxx.c

但是如果我想生成
objs/xxx.o: xxx.c
的形式,用什么参数呢?
看到了四楼的回答发现可以使用gcc的-MT(或者-MQ)的参数来改变target.
 
看到了这里继续对-MT进行资料的搜索,看到这么一个博客(http://blog.sina.com.cn/s/blog_717794b70101gjca.html),里面就包含了利用gcc生成依赖文件的规则:
%.d : %.c
        $(CC) $(CCFLAGS) -MF"$@" -MG -MM -MP -MT"$@" -MT"$(<:.c=.o)" "$<".
其中-MF是输出依赖文件名,而-MT就是说在输出的依赖文件中的目标, 楼主的例子里为-MT"$@" -MT"$(<:.c=.o)"
就是说在输出的依赖文件中目标是 "$@" 和 "$(<:.c=.o)"。于是得出两种生成依赖文件的处理方式,以下便是我修改后的makefile文件:
SUBDIRS=$(shell ls -l |grep ^d | awk '{if($$9 == "uart") print $$9}')
SRC_FILE = $(wildcard avdecc/*.c) #编译子目录下的源文件使用的方法
DEPS = $(patsubst %.c, %.d, $(SRC_FILE))// 替换成.d文件
OBJS = $(patsubst %.c, %.o, $(SRC_FILE))
 
LIB=libavdecc-host.a
all:LIB
 
LIB:$(OBJS)
$(AR) rc $(LIB) $(OBJS)
 
$(OBJS):%.o:%.c
$(CC) -MM $(CFG_INC) -MT"$*.d" -MT"$(<:.c=.o)" $< > $*.d #生成对应的依赖文件,实际上是一个Makefile文件
$(CC) -c $(CFG_INC) $(CFLAGS) $< -o $@
 
sinclude $(DEPS) #包含依赖文件到当前Makefile文件,这是个关键的步骤。因为make会把DEPS文件都包含进本makefile文件中,把它当做目标,并且检查其的生成规则。
 
$(SUBDIRS):ECHO
make -C $@ #递归编译子目录
 
ECHO:
@echo $(SUBDIRS)
 
.PHONY:clean
clean:
@$(RM) $(OBJS) $(LIB) $(DEPS) .*.sw?
make -C $(SUBDIRS) clean
CUR_SOURCE = $(wildcard ./*.c) #编译当前的源文件,使用gnu make手册的依赖文件的生成方式
CUR_OBJS = $(patsubst %.c, %.o, $(CUR_SOURCE))
DEPS = $(patsubst %.c, %.d, $(CUR_SOURCE))
 
BIN=avdecc
 
all:$(CUR_OBJS) BIN
 
$(CUR_OBJS):%.o:%.c
$(CC) $(CFLAGS) $(CFG_INC) -c -o $@ $<
 
BIN:$(CUR_OBJS)
$(CC) -o $(BIN) $(CUR_OBJS) $(CFLAGS) $(CFG_INC)
 
sinclude $(CUR_OBJS:.o=.d) #包含依赖文件到当前makefile文件
%.d:%.c
@set -e; rm -f $@; \
$(CC) -MM $(CFG_INC) $< > $@.$$$$; \ #gcc-MM生成依赖的默认形式
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
 
.PHONY:clean
clean:
@$(RM) $(CUR_OBJS) $(BIN) $(DEPS) .*.sw?
目录
相关文章
|
存储 开发框架 安全
ASP.NET Core 中间件的使用(三):全局异常处理机制(Filter拦截器对比)
ASP.NET Core 中间件的使用(三):全局异常处理机制(Filter拦截器对比)
|
监控 druid Java
Spring Boot 3 集成 Druid 连接池详解
在现代的Java应用中,使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。
8885 2
Spring Boot 3 集成 Druid 连接池详解
|
11月前
|
机器学习/深度学习 资源调度 自然语言处理
Softmax激活函数介绍
【10月更文挑战第2天】
641 0
|
10月前
|
vr&ar 网络架构
配置BGP的基本功能
本文介绍了在AR1、AR2、AR3和AR4路由器之间配置BGP协议的过程。具体包括:在AR1和AR2之间建立EBGP连接,在AR2、AR3和AR4之间建立IBGP全连接,配置IP地址,发布AR1的LoopBack1端口,引入直连路由,并通过ping测试验证网络连通性。
配置BGP的基本功能
|
10月前
|
人工智能 API Apache
推荐3款开源、美观且免费的WinForm UI控件库
推荐3款开源、美观且免费的WinForm UI控件库
1813 6
|
机器学习/深度学习
【文本分类】基于预训练语言模型的BERT-CNN多层级专利分类研究
【文本分类】基于预训练语言模型的BERT-CNN多层级专利分类研究
676 0
【文本分类】基于预训练语言模型的BERT-CNN多层级专利分类研究
|
Java 测试技术 C#
几个好用的自动化测试工具总结
【6月更文挑战第4天】几个好用的自动化测试工具总结
880 0
|
缓存 JavaScript 前端开发
【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决
跨域问题(Cross-Origin Resource Sharing,CORS)指的是在浏览器端,由于安全策略限制,不同源(域/协议/端口)之间的网页(或者Ajax请求)无法直接进行交互或访问对方的资源。同源策略是浏览器的一种安全机制,用于保护用户信息和防止恶意攻击。同源策略要求网页只能与相同源的资源进行交互,源(Origin)由协议、域名和端口号组成。当源不一致时,浏览器会阻止跨域的请求。例如,一个网页在域A中运行,试图通过JavaScript向域B发送AJAX请求,此时就会触发跨域问题。
|
存储 缓存 关系型数据库
MySQL中的存储引擎详解
MySQL中的存储引擎详解
342 0
|
安全 区块链
图解区块链:14张图看懂什么是“区块链技术”?
图解区块链:14张图看懂什么是“区块链技术”?
3370 0
图解区块链:14张图看懂什么是“区块链技术”?