考虑一下这个makefile:
CXX = g++-7
CC = gcc-7
CXXFLAGS = -Wall -Wimplicit-fallthrough -Wextra -g -fstack-protector-all -std=c++11
LDFLAGS =
EXECUTABLE = engine
EXTENSION = cc
SOURCES = $(basename $(shell find . -name '*.$(EXTENSION)'))
.PHONY: all
all: $(EXECUTABLE)
$(EXECUTABLE): $(addsuffix .o, $(SOURCES))
$(CXX) $(LDFLAGS) $^ -o $@
%.d: %.$(EXTENSION)
$(CXX) $(CXXFLAGS) -MM $< -o $@
-include $(addsuffix .d, $(SOURCES))
.PHONY: clean
clean:
find . -name '*.o' -or -name '*.d' -or -name '*~' -delete这个makefile将所有.d和.o文件放置在"src“文件夹中,.o和.cc文件位于其中。
我编辑了makefile以将.d对象放置在"obj“文件夹中,但不知何故,我现在需要一个.o规则。
这是编辑好的makefile:它在"obj“文件夹中创建%.d文件,但在出现此错误时失败:' make:*没有使目标‘obj/wireframe.o.o’的规则,这是”engine“所需要的。停下来。“
CXX = g++-7
CC = gcc-7
$(shell mkdir "obj")
CXXFLAGS = -Wall -Wimplicit-fallthrough -Wextra -g -fstack-protector-all -std=c++11
LDFLAGS =
EXECUTABLE = engine
EXTENSION = cc
SRCDIR = src
OBJDIR = obj
SOURCES = $(basename $(shell find $(SRCDIR) -name '*.$(EXTENSION)' -printf '%f\n'))
.PHONY: all
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJDIR)/$(addsuffix .o, $(SOURCES))
$(CXX) $(LDFLAGS) $^ -o $@
%.d: $(SRCDIR)/%.$(EXTENSION)
$(CXX) $(CXXFLAGS) -MM $< -o $(OBJDIR)/$@
-include $(addsuffix .d, $(SOURCES))
.PHONY: clean
clean:
find . -name '*.o' -or -name '*.d' -or -name '*~' -delete发布于 2018-04-25 17:01:26
这不能像你看起来想做的那样:
$(EXECUTABLE): $(OBJDIR)/$(addsuffix .o, $(SOURCES))这是如何扩大的?看看扩张的“第一层次”:
engine: obj/$(addsuffix .o, foo bar biz baz)然后,如果您扩展其他的方式,您将得到:
engine: obj/foo.o bar.o biz.o baz.o仅仅在展开事物列表之前粘贴一个字符串($(OBJDIR)/)并不能将该字符串应用于列表中的所有元素!它只将其添加到列表中的第一项。
你想要这样的东西:
# Use := here, not =, so you don't run this shell command lots of times!
SOURCES := $(shell find $(SRCDIR) -name '*.$(EXTENSION)' -print)
OBJECTS := $(patsubst %.$(EXTENSION),$(OBJDIR)/%.o,$(notdir $(SOURCES)))
$(EXECUTABLE): $(OBJECTS)https://stackoverflow.com/questions/50000141
复制相似问题