Проблема с вложенным исходным каталогом century
.Если вы добавите в make-файл:
info:
@echo " Info..."
@echo " SOURCES = $(SOURCES)"
@echo " OBJECTS = $(OBJECTS)"
, то make info
даст:
Info...
SOURCES = src/century/century_carbon.cpp src/some_files.cpp
OBJECTS = build/century_carbon.o build/some_files.o
Эта проверка показывает, что ваша конструкция этих макросов в порядке.И это также показывает, как вы сообщаете, что make
тогда скажет нам:
make: *** No rule to make target 'build/century_carbon.o', needed by 'bin/formind'. Stop.
Если вы добавите дополнительное правило с указанным каталогом century
:
$(BUILDDIR)/%.o: $(SRCDIR)/century/%.cpp
@mkdir -p $(BUILDDIR)
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
тогда ваша сборка будет продолжена.
Альтернативное решение - использовать VPATH
.Добавьте строку:
VPATH = src:src/century
, а также удалите $(SRCDIR)/
из своего правила, которое теперь становится:
$(BUILDDIR)/%.o: %.cpp
@mkdir -p $(BUILDDIR)
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
Обновление: Ответ вышеможет быть улучшено двумя способами:
Это удивительно просто: просто замените мою жестко запрограммированную строку VPATH
на:
vpath %.cpp $(sort $(dir $(SOURCES)))