2016-07-27 121 views
0

我的Makefile文件位于下方,我使用.d文件进行自动依赖,但是它不起作用,当我修改了一些.h文件时,这很奇怪,但为什么.. 感谢您帮助为什么我的Makefile自动依赖关系不起作用

PROGRAM := a.out 
SRCDIRS := ./src/access 
INCLUDE := -I./include/access 
SRCEXTS := .cpp 
CPPFLAGS := -g -Wall 
LDFLAGS := 

CXX  = g++ 
RM  = rm -f 

SHELL = /bin/sh 
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) 
OBJS = $(foreach x,$(SRCEXTS), \ 
     $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES)))) 
DEPS = $(patsubst %.o,%.d,$(OBJS)) 
.PHONY : all objs clean cleanall rebuild 
all : $(PROGRAM) 


objs : $(OBJS) 
%.o : %.cpp 
    $(CXX) -c $(CPPFLAGS) $< -o [email protected] $(INCLUDE) 

$(PROGRAM) : $(OBJS) 
    $(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS) 
rebuild: clean all 
clean : 
    @$(RM) $(OBJS) $(DEPS) 
cleanall: clean 
    @$(RM) $(PROGRAM) 

-include $(DEPS) 
%.d : %.cpp 
    rm -f [email protected]; $(CXX) -MM $< $(INCLUDE) > [email protected]$$$$; \ 
    sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \ 
    rm -f [email protected]$$$$ 
+0

不再使用古代的依赖代码,GCC已经拥有像['MMD'和'MP'](http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/) 15年 – user657267

回答

0

没有什么导致了%.d模式运行,因为%.o不依赖于它。因此,根据您的makefile,Make只需使用已在磁盘上存在的任何$(DEPS)文件。

由于您声明的相关性,%.d文件只会在需要时才会重新生成,并且相应的%.cpp文件已被修改。

%.d添加到%.o依赖关系应该添加所需的依赖关系,尽管您可能仍需要确保%.d以某种方式在-include之前运行。

理想的情况下,每个%.d文件应该依赖于任何%.h文件中的相应文件%.cpp依赖,但习惯性地解决了鸡和蛋的问题是比严格意义上更经常迫使重建%.d文件。

+0

有关该主题的更多信息,请参阅例如http://stackoverflow.com/questions/297514/how-can-i-have-a-makefile-automatically-rebuild-source-files-that-include-a-modi – tripleee