Makefile不会在头文件更改时重新编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile不会在头文件更改时重新编译相关的知识,希望对你有一定的参考价值。
我有2个.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
答案
您没有正确包含您的依赖项文件。那里的通配符没有你想要的。它更简单:
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.hh
的a.cpp
。
make文件的语法是
target: dependency_1 dependency_2 etc
rule
在上次更新它们时检查所有依赖项,如果它们中的任何一个具有比目标更新的时间戳,则执行该规则。在Makefile中,依赖项列表中没有任何标头。
以上是关于Makefile不会在头文件更改时重新编译的主要内容,如果未能解决你的问题,请参考以下文章