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)