patsubst и компиляция исходных файлов

Как я понимаю, приведенные ниже строки в моем make-файле должны компилировать все исходные файлы в текущем каталоге

SRC=Connection.cpp Request.cpp SessionHandler.cpp
OBJS=$(patsubst %.cpp,obj/%.o,$(SRC))

$(OBJS) : | obj
obj:
        @mkdir -p $@
obj/%.o : %.cpp
        g++ -std=c++11 -c $< -o $@

Но только первый файл в $(SRC) компилируется и помещает объект в./obj

g++ -std=c++11 -c Connection.cpp -o obj/Connection.o

Что мне здесь не хватает? Благодарю.

1 ответ

Решение

В make-файле может быть только одна цель по умолчанию.

Управление целью по умолчанию обсуждается в Руководстве по GNU Make в разделе " Аргументы для определения целей ".

Ключевой момент, который для этого вопроса:

По умолчанию цель является первой целью в make-файле (не считая целей, начинающихся с точки).

Поэтому в вашем случае целью по умолчанию является obj/Connection.o потому что этот кусочек твоего make-файла

$(OBJS) : | obj

расширяется до

obj/Connection.o obj/Request.o obj/SessionHandler.o: | obj

что эквивалентно

obj/Connection.o: | obj
obj/Request.o: | obj
obj/SessionHandler.o: | obj

Чтобы получить все ваши объектные файлы, созданные по умолчанию, вы хотите заменить

$(OBJS) : | obj

с

.PHONY: all
all: $(OBJS)
Другие вопросы по тегам