作者:baby欧米茄 | 来源:互联网 | 2023-10-11 16:46
在自动生成依赖关系是要使用.d文件请问怎么使用该文件-include$(DEPS)#DEPS是指定的.d文件的变量当Makefile包含了.d文件之后什么也没做呀,.d文件是怎么起作用的?如
在自动生成依赖关系是要使用.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文件放到别的文件夹里或者原文件不在当前目录下那上面两句还能好用吗?
9 个解决方案
.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的时候不显示系统头文件.
自动生成的依赖文件不用包含在makefile中?
至少我从来没有依赖过.h文件
lz的代码最好弄清楚点。
谢谢楼上的两位
我知道.d文件是包含文件的依赖关系
我是不知道.d文件在Makefile文件中的作用,和它是怎样起作用的?
建议楼主去看一下<<跟我一起写Makefile>>
-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)需要这些目标文件。
>>>>>我是不知道.d文件在Makefile文件中的作用,和它是怎样起作用的?
.d 可以是一个临时文件,保存了依赖关系.这些以来关系还是要加到Makefile文件里的.在
使用include将.d文件里内容加到Makefile文件里.
我还有问题
-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 等这样的语句了?
不需要.
加入-include $(DEPS)根据隐含规则生成目标文件.
你的makefile是一个通用的makefile.
我有点不明白,既然Makefile文件可以将.d的文件包含进来,为什么还要在源程序包含呢