C++ 无法获取makefile以从其相应的源生成每个对象

C++ 无法获取makefile以从其相应的源生成每个对象,c++,linux,shell,makefile,command-line-interface,C++,Linux,Shell,Makefile,Command Line Interface,我对此生成文件有问题。我不知道如何从它们的共同响应源构建对象文件。每个obj都是用主源而不是它的一个来构建的 TARGET = af_optional SOURCES := $(wildcard src/*.cpp) OBJECTS := $(patsubst src/%.cpp,obj/%.o,$(SOURCES)) DEPENDS := $(patsubst src/%.cpp,obj/%.d,$(SOURCES)) CXXFLAGS = -g -I. # ADD MORE WAR

我对此生成文件有问题。我不知道如何从它们的共同响应源构建对象文件。每个obj都是用主源而不是它的一个来构建的

TARGET   = af_optional

SOURCES := $(wildcard src/*.cpp)
OBJECTS := $(patsubst src/%.cpp,obj/%.o,$(SOURCES))
DEPENDS := $(patsubst src/%.cpp,obj/%.d,$(SOURCES))

CXXFLAGS = -g -I.

# ADD MORE WARNINGS!
WARNING := -Wall -Wextra

# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean

# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: bin/$(TARGET)

clean:
    $(RM) $(OBJECTS) $(DEPENDS) $(TARGET)

# Linking the executable from the object files
bin/$(TARGET): $(OBJECTS)
    @echo "target : $(TARGET)"
    @echo "sources: $(SOURCES)"
    @echo "objects: $(OBJECTS)"
    @echo "depends: $(DEPENDS)"
    @mkdir -p bin
    $(CXX) $(WARNING) $(CXXFLAGS) $^ -o $@

-include $(DEPENDS)

$(OBJECTS): $(SOURCES) makefile
    @mkdir -p obj
    $(CXX) $(WARNING) $(CXXFLAGS) -MMD -MP -c $< -o $@
TARGET=af\u可选
来源:=$(通配符src/*.cpp)
对象:=$(patsubst src/%.cpp,obj/%.o,$(源代码))
依赖项:=$(patsubst src/%.cpp,obj/%.d,$(源))
CXXFLAGS=-g-I。
#添加更多警告!
警告:=-Wall-Wextra
#.虚假意味着这些规则即使在
#这些名称的文件存在。
.骗子:都是干净的
#第一条规则是默认规则,即“make”,
#“全部制造”和“停车制造”的含义相同
全部:bin/$(目标)
清洁:
$(RM)$(对象)$(依赖)$(目标)
#从对象文件链接可执行文件
bin/$(目标):$(对象)
@echo“目标:$(目标)”
@echo“源:$(源)”
@回显“对象:$(对象)”
@echo“依赖:$(依赖)”
@mkdir-p-bin
$(CXX)$(警告)$(CXXFLAGS)$^-o$@
-包括美元(视情况而定)
$(对象):$(源)生成文件
@mkdir-p obj
$(CXX)$(警告)$(CXXFLAGS)-MMD-MP-c$<-o$@
我在不久前研究时写了这个makefile,但在我让它工作后我弄坏了一些东西,直到现在我才注意到,因为我必须处理的所有项目都是单一来源的。

这个规则是错误的:

$(OBJECTS): $(SOURCES) makefile
这扩展到什么?如果您有来源
src/foo.cpp
src/bar.cpp
,以及
src/baz.cpp
,那么它将是:

obj/foo.o obj/bar.o obj/baz.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile
这是一个非常常见的问题:人们似乎有这样的想法,make将以某种方式对所有这些目标和先决条件进行处理,以某种方式进行匹配,从而使每个对象文件仅依赖于相应的源文件

但是,make不会这样做。上述规则与编写所有这些规则完全相同:

obj/foo.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile
obj/bar.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile
obj/baz.o : src/foo.cpp src/bar.cpp src/baz.cpp makefile

现在,也许您可以了解为什么您会看到这样的行为:每个目标的第一个先决条件是完全相同的文件
src/foo.cpp
,因此,当您使用
$Thank时,它的作用非常大。我错误地记得我可以以某种方式使用顶部声明的变量。
obj/%.o : src/%.cpp makefile
        @mkdir -p obj
        $(CXX) $(WARNING) $(CXXFLAGS) -MMD -MP -c $< -o $@