makefile中使用编译器自动生成依赖关系的一小问题
近来,看一makefile教程中说使用编译器自动生成依赖关系用以下方式。
e.g.
%.d: %.c
@set -e; rm -f $@; \
gcc -MM ${CFLAGS} $< > $@.$$$$; \
sed 's,\($*\)\.o[:]*,\1.o $@ : .g' < $@.$$$$ > $@; \
rm -f $@.$$$$
以上式子的目的是,将自动生成的依赖关系,修改后再保存在后缀.d的文件中
比如,自动生成的关系:main.o: main.c defs.h,
则转化为:main.o main.d: main.c defs.h
然后,将.d的文件导入到主makefile中,如下:
include ${sources:.c=.d}
上面的sed没必要看懂,我的问题是,为什么要将main.o: main.c defs.h 转化为 main.o main.d: main.c defs.h?
我觉得没必要啊?main.d只跟main.c有关,干嘛还要跟defs.h有关呢?
请赐教。
问题点数:100、回复次数:10Top
1 楼jixingzhong(瞌睡虫·星辰)回复于 2006-06-02 09:26:12 得分 20
没研究过这个,
是否任意文件都需要这个 defs.h ?
就如同 VC 中的 stdafx.h ....Top
2 楼hslinux(幻世龙)回复于 2006-06-02 09:44:14 得分 20
main.c依赖defs.h,也就是defs.h中定义有main.c需要的东东.Top
3 楼zidane_yubo(天涯独尊)回复于 2006-06-02 16:50:45 得分 20
defs.h 里面是依赖关系啊Top
4 楼lucky520()回复于 2006-06-02 19:26:07 得分 20
.o依赖于.h,.c当.h.c的时间比.o的时间晚后,就要重新compileTop
5 楼happytang(一只叫苏格拉底的猪)回复于 2006-06-02 19:48:50 得分 0
建议看看 GNU Make 使用手册(中译版)
这里的defs.h是所有OBJ文件的共同的一个依赖Top
6 楼happytang(一只叫苏格拉底的猪)回复于 2006-06-02 19:49:53 得分 20
http://lsec.cc.ac.cn/~peace/articles/gnumaketranslated.html
GNU Make 使用手册(中译版)Top
7 楼Sanco(十扇门)回复于 2006-06-05 10:44:49 得分 0
include ${sources:.c=.d} means:
e.g.
${sources} = test1.c test2.c main.c
so: include test1.d test2.d main.d
test1.d test2.d main.d都被作为makefile导入到主makefile中。
main.c 依赖 defs.h 没错,我只是觉得 main.d 没必要依赖 defs.h
不知道我有没有说明白。:-)Top
8 楼zidane_yubo(天涯独尊)回复于 2006-06-05 17:10:26 得分 0
你不这样写就没必要 %.d: %.c
这样写了 就要检查依赖关系
Top
9 楼Sanco(十扇门)回复于 2006-06-09 18:57:44 得分 0
我大致了解了。按照堆栈的思想就没错的。Top
10 楼Sanco(十扇门)回复于 2006-06-09 19:11:55 得分 0
好像在散分。我认为我的问题刚好就是答案。答案就是:没必要。
不要迷信书上讲的(虽然大部分是正确的),自己亲手去做才知道。
Top




