2015-06-20 243 views
-1

我有2 .cpp文件:main.cppA.cppinclude dir中的一些头文件。Makefile不重新编译头文件更改

我正在尝试编写一个makefile,在头文件发生更改时重新编译。

现在我试着按照示例here中的方法概述。但是我无法开始。这是我迄今的尝试。

CC := g++ 
OBJS := main.o A.o 
OUTPUT := program.exe 
INCLUDE_DIR := -I ./include \ 

#linking step 
all: $(OBJS) 
    $(CC) $(INCLUDE_DIR) $(OBJS) -o $(OUTPUT) 

#compile and generate dependency info 
%.o : %.cpp 
    $(CC) $(INCLUDE_DIR) -c $*.cpp -o $*.o 
    $(CC) $(INCLUDE_DIR) -MMD -c -o [email protected] $< 

-include *.d 
+1

你是什么意思“你无法入门”?什么是错误? – Barry

回答

2

你没有正确包含你的依赖文件。那里的通配符不会做你想要的。这将会是简单的只是:

DEPS = $(OBJS:.o=.d) 
-include $(DEPS) 

要真正通配符的依赖关系,你需要做的:

-include $(wildcard *.d) 

注意,GCC实际上可以让你产生依赖,并在目标文件同时。这可能只是你的规则。此外,我觉得明确指出一切事情的进展情况会更好,以防发生任何问题:

%.o : %.cpp 
    $(CC) $(INCLUDE_DIR) -c $< -o [email protected] -MMD -MF $(@:.o=.d) 
+1

你能解释一下'-MMD'和'-MF'标志是如何工作的吗? – SU3

+1

@ SU3请参见[预处理器选项](https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html),特别是'-M'的描述。 – Barry

+0

使用'MMD'时,'MF'标志是毫无意义的,与'MD'标志相反。 – Chnossos

1

您需要将头文件包含在依赖关系列表中。例如:

%.o : %.cpp %.hh 
    $(CC) $(INCLUDE_DIR) -c $*.cpp -o $*.o 
    $(CC) $(INCLUDE_DIR) -MMD -c -o [email protected] $< 

如果你对每一个a.cppa.hh

make文件的语法是

target: dependency_1 dependency_2 etc 
    rule 

所有的依赖,当他们最后一次更新的时间进行检查,如果其中一方具有时间戳更近那么目标,执行规则。在您的Makefile中,依赖关系列表中没有任何标题。

+0

对于每个%.cpp,可能没有%.hh,并且自动生成依赖关系的整个要点是使它们正确。 – Barry

+0

@Barry我明白,这就是为什么我写了“**如果**你对每个'a.cpp'都有'a.hh'”。另外,我只是扩大了答案。 – SU3

+0

这是一个很大的假设,可能永远不会是真的,因为OP的目标是让编译器通过'* .d'文件为他生成正确的依赖关系,所以变得更加不必要。这个答案是错误的。 – Barry