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

问题描述 投票:-1回答:2

我有2个.cpp文件:main.cpp A.cppinclude目录中的几个头文件。

我正在尝试编写一个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
c++ makefile
2个回答
2
投票

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

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

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

-include $(wildcard *.d)

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

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

1
投票

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

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

如果你有每个a.hha.cpp

make文件的语法是

target: dependency_1 dependency_2 etc
    rule

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

© www.soinside.com 2019 - 2024. All rights reserved.