Makefile - 编辑makefile后突然需要.o规则

时间:2018-04-24 11:07:07

标签: makefile

考虑这个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

1 个答案:

答案 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)