C++ 无法获取makefile以从其相应的源生成每个对象
我对此生成文件有问题。我不知道如何从它们的共同响应源构建对象文件。每个obj都是用主源而不是它的一个来构建的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
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 $@