在Makefile中如何使用.d文件?

tm_wb 2006-08-23 03:49:42
在自动生成依赖关系是要使用.d文件请问怎么使用该文件
-include $(DEPS)
#DEPS是指定的.d文件的变量
当Makefile包含了.d文件之后什么也没做呀,.d文件是怎么起作用的?
如下有一个Makefile

EXECUTABLE := mushroom.exe
LIBS := alleg

CFLAGS := -g -Wall -O3 -m486
CXXFLAGS := $(CFLAGS)

RM-F = rm -f

SOURCE := $(wildcard *.c) $(wildcard *.cc)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE)))
DEPS := $(patsubst %.o,%.d,$(OBJS))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) \
$(patsubst %.d,%.cc,$(MISSING_DEPS)))
CPPFLAGS += -MD
.PHONY : everything deps objs clean veryclean rebuild

everything : $(EXECUTABLE)

deps : $(DEPS)

objs : $(OBJS)

clean :
@$(RM-F) *.o
@$(RM-F) *.d

veryclean: clean
@$(RM-F) $(EXECUTABLE)

rebuild: veryclean everything

ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :
@$(RM-F) $(patsubst %.d,%.o,$@)
endif

-include $(DEPS)

$(EXECUTABLE) : $(OBJS)
gcc -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS))

###########################################
deps : $(DEPS)

objs : $(OBJS)
这两句没有任何命令,是不是使用了隐含规则?
-include $(DEPS)
只是把.d文件包含进来,这样它就能起作用吗?
还有如果我想不生成的.o .d文件放到别的文件夹里或者原文件不在当前目录下那上面两句还能好用吗?
...全文
2130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
MAKEWELLDONE 2010-06-20
  • 打赏
  • 举报
回复
我有点不明白,既然Makefile文件可以将.d的文件包含进来,为什么还要在源程序包含呢
fytzzh 2006-08-24
  • 打赏
  • 举报
回复
不需要.
加入-include $(DEPS)根据隐含规则生成目标文件.
你的makefile是一个通用的makefile.
tm_wb 2006-08-24
  • 打赏
  • 举报
回复
我还有问题
-include $(DEPS) 将会把*.d文件里内容插入到Makefile里.
这样的话Makefile就变成这样了:

... ...
test.o: test.c a.h a1.h a2.h a3.h a4.h
xxx.o: xxx.c xxx.h
... ...
这样就可以生成目标文件了。然而$(BIN)需要这些目标文件
那么make 是不是根据.d中的内容如
test.o: test.c a.h a1.h a2.h a3.h a4.h
在根据隐含规则生成.o文件?
那么我们在Makefile中是不是不需要再写诸如%.o : %.c 等这样的语句了?
fytzzh 2006-08-24
  • 打赏
  • 举报
回复
>>>>>我是不知道.d文件在Makefile文件中的作用,和它是怎样起作用的?
.d 可以是一个临时文件,保存了依赖关系.这些以来关系还是要加到Makefile文件里的.在
使用include将.d文件里内容加到Makefile文件里.
fytzzh 2006-08-24
  • 打赏
  • 举报
回复
-include $(DEPS) 将会把*.d文件里内容插入到Makefile里.
这样的话Makefile就变成这样了:

... ...
test.o: test.c a.h a1.h a2.h a3.h a4.h
xxx.o: xxx.c xxx.h
... ...
这样就可以生成目标文件了。然而$(BIN)需要这些目标文件。
besthyq 2006-08-24
  • 打赏
  • 举报
回复
建议楼主去看一下<<跟我一起写Makefile>>
tm_wb 2006-08-24
  • 打赏
  • 举报
回复
谢谢楼上的两位
我知道.d文件是包含文件的依赖关系
我是不知道.d文件在Makefile文件中的作用,和它是怎样起作用的?
johndiyang 2006-08-23
  • 打赏
  • 举报
回复
自动生成的依赖文件不用包含在makefile中?
至少我从来没有依赖过.h文件

lz的代码最好弄清楚点。
fytzzh 2006-08-23
  • 打赏
  • 举报
回复
.d文件里包含了目标文件的所有依赖.
比如: test.c 里包含a.h a1.h a2.h a3.h a4.h 头文件.这些都是目标文件test.o的依赖文件.\
bash-2.05a$ cat test.c
#include <stdio.h>
#include <string.h>

#include "a.h"
#include "a1.h"
#include "a2.h"
#include "a3.h"
#include "a4.h"
bash-2.05a$ gcc -MM test.c
test.o: test.c a.h a1.h a2.h a3.h a4.h ==>自动生成依赖文件,不需要手动指定.-MM的时候不显示系统头文件.

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧