Build Make忽略生成的依赖项

Build Make忽略生成的依赖项,build,makefile,gnu-make,Build,Makefile,Gnu Make,我正在尝试为我的项目编写一个Makefile,它会自动生成源文件之间的依赖关系。 生成文件如下所示: CC = g++ CFLAGS = -std=c++11 -Wfatal-errors -fdiagnostics-color=always LDFLAGS = -lm -lfftw3 SRCDIR = src OBJDIR = obj DEPDIR = dep SRCS = $(wildcard $(SRCDIR)/*.cpp) OBJS = $(patsubst $(SRCDIR)/

我正在尝试为我的项目编写一个Makefile,它会自动生成源文件之间的依赖关系。 生成文件如下所示:

CC = g++

CFLAGS  = -std=c++11 -Wfatal-errors -fdiagnostics-color=always
LDFLAGS = -lm -lfftw3

SRCDIR = src
OBJDIR = obj
DEPDIR = dep

SRCS = $(wildcard $(SRCDIR)/*.cpp)
OBJS = $(patsubst $(SRCDIR)/%.cpp,$(OBJDIR)/%.o,$(SRCS)) 
DEPS = $(patsubst $(SRCDIR)/%.cpp,$(DEPDIR)/%.d,$(SRCS))

PROG = whistle_recognition

$(PROG): $(OBJS)
    $(CC) $(CFLAGS) -o$(PROG) $(OBJS) $(LDFLAGS)

.PHONY: clean run

$(DEPS): $(DEPDIR)/%.d : $(SRCDIR)/%.cpp
    $(CC) $(CFLAGS) -MM $< -MF $@

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -r $(OBJS) $(DEPS) $(PROG) 

run: $(PROG)
    ./$(PROG)

-include $(DEPS)
make-p whistle|u recognition | signalscanner.o的输出(缩写):


还有一个问题:
g++
不包括目标的
obj/
-前缀。。。有没有办法通过模式替换来解决这个问题?

人们通常有这样的依赖项生成规则,但它们确实是不必要的

第一次构建项目时,不需要依赖项,因为它构建了所有源。只有后续构建需要来自上一个构建的依赖关系来检测需要重建的内容

依赖关系只是编译的副产品


生成的依赖项包含对应的
.o
文件的路径。由于生成依赖项时未指定
.o
输出路径,因此这些路径不正确

以下解决方案将
.d
文件与相应的
.o
文件放在一起,这些
.d
文件包含到
.o
的正确路径。它还一次完成编译和依赖关系

修正:

删除以下行:

$(DEPS): $(DEPDIR)/%.d : $(SRCDIR)/%.cpp
    $(CC) $(CFLAGS) -MM $< -MF $@
-include $(DEPS)
DEPS = $(OBJS:%.o=%.d)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 
    $(CC) -c $(CFLAGS) -MD -MP -o $@ $< 

你能显示
dep/foo.d
文件吗?您是否看到make在
make-d
输出中包含
dep/foo.d
文件?
make-p
输出是否在任何地方显示
qux.h
?作为
foo.o
的dep,这里有
dep/signalscanner.d
文件:
signalscanner.o:src/signalscanner.cpp src/signalscanner.h\src/frequencyanalyzer.h src/FrequeAnalyzer_test.h src/wav_file.h\src/signalscanner_test.h
那么,依赖项的生成不正确。请参阅我的解决方案。请参阅
signalscanner.o
?那不是你正在建造的。这就是问题所在。你需要解决这个问题。我不知道你是否能让
gcc
自动吐出带有前缀if you'll have
sed
/等的目标。将其放入文件中,但修复它,它就会起作用。
gcc
-MT
参数可以做你想做的事情,但马克西姆·埃戈鲁什金的答案通常是更好的。@EtanReisner添加了一个参数给你解释一下。好多了,谢谢。虽然为了清晰起见,我可能保留了
DEPS
变量。@EtanReisner是的,有了
DEPS
变量,更改会更短。最后我不得不移除if防护,但它现在可以工作了。谢谢@向量,这是一个次要的优化,在清理时不包括依赖项。
$(DEPS): $(DEPDIR)/%.d : $(SRCDIR)/%.cpp
    $(CC) $(CFLAGS) -MM $< -MF $@
-include $(DEPS)
DEPS = $(OBJS:%.o=%.d)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 
    $(CC) -c $(CFLAGS) -MD -MP -o $@ $< 
ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif