Makefile不会在头文件更改时重新编译

时间:2015-06-20 17:53:17

标签: c++ makefile

我有两个.cpp个文件:main.cpp A.cpp以及include目录中的少量头文件。

我正在尝试编写一个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 $@ $<

-include *.d

2 个答案:

答案 0 :(得分:2)

您没有正确包含您的依赖项文件。那里的通配符没有你想要的。只是简单地说:

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

要实际使用带有依赖项的通配符,您必须执行以下操作:

-include $(wildcard *.d)

请注意,gcc实际上允许您同时生成依赖项和目标文件。这可以简化您的规则。此外,我发现如果出现任何问题,最好明确说明所有事情的进展情况:

%.o : %.cpp
    $(CC) $(INCLUDE_DIR) -c $< -o $@ -MMD -MF $(@:.o=.d)

答案 1 :(得分:1)

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

%.o : %.cpp %.hh
    $(CC) $(INCLUDE_DIR) -c $*.cpp -o $*.o 
    $(CC) $(INCLUDE_DIR) -MMD -c -o $@ $<

如果每个a.hh都有a.cpp

make文件语法是

target: dependency_1 dependency_2 etc
    rule

上次更新所有依赖项时会检查它们,如果它们中的任何一个具有比目标更新的时间戳,则执行该规则。在Makefile中,依赖项列表中没有任何标题。