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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile不会在头文件更改时重新编译相关的知识,希望对你有一定的参考价值。

我有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
答案

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

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

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

-include $(wildcard *.d)

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

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

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

%.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中,依赖项列表中没有任何标头。

以上是关于Makefile不会在头文件更改时重新编译的主要内容,如果未能解决你的问题,请参考以下文章

Makefile 总是重新编译一个文件

如何修改makefile以将更改的源编译到对象目录中,文件列表除外

makefile--回顾基础篇

Makefile 只重新编译更改的对象?

在文件更改时自动重新编译和重新加载服务器

Makefile中自动生成头文件依赖