首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile -编辑makefile后突然需要.o规则

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

Stack Overflow用户
提问于 2018-04-24 11:07:06
回答 1查看 53关注 0票数 0

考虑一下这个makefile:

代码语言:javascript
复制
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“所需要的。停下来。“

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-25 17:01:26

这不能像你看起来想做的那样:

代码语言:javascript
复制
$(EXECUTABLE): $(OBJDIR)/$(addsuffix .o, $(SOURCES))

这是如何扩大的?看看扩张的“第一层次”:

代码语言:javascript
复制
engine: obj/$(addsuffix .o, foo bar biz baz)

然后,如果您扩展其他的方式,您将得到:

代码语言:javascript
复制
engine: obj/foo.o bar.o biz.o baz.o

仅仅在展开事物列表之前粘贴一个字符串($(OBJDIR)/)并不能将该字符串应用于列表中的所有元素!它只将其添加到列表中的第一项。

你想要这样的东西:

代码语言:javascript
复制
# 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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50000141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档