考虑这个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文件放在我的.cc和.h文件所在的“src”文件夹中。
我编辑了makefile以将.d对象放在“obj”文件夹中,但不知怎的,我现在需要一个.o规则。
这是已编辑的makefile:它在“obj”文件夹中创建%.d文件,但随后出现此错误: 'make:***没有规则来制作目标'obj / wireframe.o','引擎'需要。停止'。
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
答案 0 :(得分:1)
这不符合您的要求:
$(EXECUTABLE): $(OBJDIR)/$(addsuffix .o, $(SOURCES))
这是如何扩展的?看看扩张的“第一级”:
engine: obj/$(addsuffix .o, foo bar biz baz)
然后,如果你继续扩展你将获得的其余部分:
engine: obj/foo.o bar.o biz.o baz.o
在扩展事物列表之前粘贴一个字符串($(OBJDIR)/
)不会将该字符串应用于列表的所有元素!它只会将其添加到列表中的 first 项目中。
你想要这样的东西:
# 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)