当前位置: 技术问答>linux和unix
在Makefile中如何使用.d文件?
来源: 互联网 发布时间:2016-01-04
本文导语: 在自动生成依赖关系是要使用.d文件请问怎么使用该文件 -include $(DEPS) #DEPS是指定的.d文件的变量 当Makefile包含了.d文件之后什么也没做呀,.d文件是怎么起作用的? 如下有一个Makefile EXECUTABLE := mushroom.exe ...
在自动生成依赖关系是要使用.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文件放到别的文件夹里或者原文件不在当前目录下那上面两句还能好用吗?
-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文件放到别的文件夹里或者原文件不在当前目录下那上面两句还能好用吗?
|
.d文件里包含了目标文件的所有依赖.
比如: test.c 里包含a.h a1.h a2.h a3.h a4.h 头文件.这些都是目标文件test.o的依赖文件.
bash-2.05a$ cat test.c
#include
#include
#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的时候不显示系统头文件.
比如: test.c 里包含a.h a1.h a2.h a3.h a4.h 头文件.这些都是目标文件test.o的依赖文件.
bash-2.05a$ cat test.c
#include
#include
#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的时候不显示系统头文件.