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?

时间: 2024-10-24 06:57:10

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

Makefile 自动生成依赖

虽然以前对Makefile有个基本概念,但是真正到自己去写一个哪怕是简单的Makefile时也会遇到不少的麻烦.    现在我有如下文件 dList.h dList.c memory.c debug.c debug.h test.c aaron.h 其中包含关系如下:    aaron.h-->dList.h debug.h    dList.c-->aaron.h    debug.c-->aaron.h    test.c-->aaron.h    memory.c-->

Makefile自动生成头文件依赖

前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖. CC = gcc CFLAGS = -Wall -O INCLUDEFLAGS = LDFLAGS = OBJS = seq.o TARGETS = test_seq .PHONY:all all : $(TARGETS) test_seq:test_seq.o $(OBJS) $(CC) -o

Wix 安装部署(一)同MSBuild 自动生成打包文件

原文:Wix 安装部署(一)同MSBuild 自动生成打包文件       因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不同.我自己也在测试过程中,写下过程,以供参考.最新版本WiX Toolset v3.7,如何安装的就不说了,可以参考 http://blog.csdn.net/rryqsh/article/details/8274832         打包关心的问题有 1).Net版本检查  2)桌面和菜单栏的快捷方式 3)更换图标画面,进度条

makefile自动生成依赖关系

手工编写依赖关系不仅工作量大而且极易出现遗漏,更新也很难及时,修改源或头文件后makefile可能忘记修改.为了解决这个问题,可以用gcc的-M选项自动生成目标文件和源文件的依赖关系.-M选项会把包含的系统头文件以及其所包含的其他系统头文件也找出来了,如果我们不需要输出系统头文件的依赖关系时,可以用-MM选项. 下面我们以一个简单的例子来说明如何自动生成依赖关系: exm/      main.c      s.c      s.h makefile文件内容如下: all:a src=$(wil

根据MIDlet套件自动生成jad文件

我们经常遇到有jar文件但是却没有jad文件的情况,这时候如果你想使用模拟器来运行恐怕麻烦一些.当然你可以根据jar文件中的Manifest.mf文件,自己手写jad文件.需要注意的是自己手写的时候一定不能忽略如下两个参数:MIDlet-Jar-Size和MIDlet-Jar-URL. 互联网上也有一些工具可以根据jar文件自动生成jad文件.下面我们使用java来实现一个简单的jad文件生成器.解决这个问题的关键在于使用java.util.jar包提供的api解析jar包,然后将其Manife

Flash文件嵌入音频文件的两种方法

核心提示:本文介绍在flash文档中嵌入音频文件的两种方法,使其可以在Flash player中正常播放. 本文介绍在flash文档中嵌入音频文件的两种方法,使其可以在Flash player中正常播放. 1.建立 Sound 对象用 load() 方法加载外部的 MP3 来播放; 2.让 Sound 对象监听 sampleData 事件,这样可以播放由程序动态生成的声音,例如: 下面的示例播放简单的正弦波. 以下是引用片段: var mySound:Sound = new Sound(); f

PHP使用imagick读取PDF生成png缩略图的两种方法

 这篇文章主要介绍了PHP使用imagick读取PDF第一页生成png缩略图的两种方法,使用了PHP扩展php_imagick,需要的朋友可以参考下 一.ImageMagick是什么 ImageMagick是一套功能强大.稳定而且免费的工具集和开发包,可以用来读.写和处理超过185种基本格式的图片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式.利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大

动态加载JavaScript文件的两种方法_javascript技巧

这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval()实施代码.第二种是,动静创建一个script标签,配置其src属性,经过把script标签插入到页面head来加载js,相当于正在head中写了一个<script src="..."></script>,只可是这个script标签是用js动静创建的 比喻说是我们

PHP使用imagick读取PDF生成png缩略图的两种方法_php实例

一.ImageMagick是什么ImageMagick是一套功能强大.稳定而且免费的工具集和开发包,可以用来读.写和处理超过185种基本格式的图片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式.利用ImageMagick,你可以根据web应用程序的需要动态生成图片, 还可以对一个(或一组)图片进行改变大小.旋转.锐化.减色或增加特效等操作,并将操作的结果以相同格式或其它格式保存.二.php_imagick什么一个可以供PHP调用ImageMagick功