Makefile - внезапно требуется правило .o после редактирования make-файла - PullRequest
0 голосов
/ 24 апреля 2018

Рассмотрим этот make-файл:

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

Этот make-файл помещает все файлы .d и .o в папку "src", где находятся мои файлы .cc и .h.

Я отредактировал make-файл, чтобы поместить объекты .d в папку "obj", но теперь мне как-то нужно правило .o.

Это отредактированный make-файл: он создает файлы% .d в папке "obj", но затем завершается с ошибкой: 'make: *** Нет правила для создания цели' obj / wireframe.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

1 Ответ

0 голосов
/ 25 апреля 2018

Это не будет делать то, что вы хотите:

$(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...