Правило записи в вашем make-файле:
create-exercise.o: exercise.hpp
Это правило без рецепта, и оно просто добавляет еще одно условие (exercise.hpp
) к цели create-exercise.o
, т.е. всякий раз, когда exercise.hpp
изменяется, create-exercise.o
следует перестраивать.
Однако проблема при предоставлении этого правила заключается в том, что GNU Make предполагает, что create-exercise.o
является объектным файлом, сгенерированным из исходного файла C при сборке. create-exercise
. Следовательно, он не связывает библиотеку C ++, а библиотеку C, поэтому у вас есть симпатичная ошибка неопределенной ссылки на std::cout
.
В GNU Make есть следующее неявное правило для генерации исполняемый файл из исходного файла C ++:
%: %.cpp
# commands to execute (built-in):
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
Вы можете использовать рецепт этого правила для сборки create-exercise
из creating-exercise.o
и по-прежнему обрабатывать creating-exercise.o
как объектный файл, созданный из исходного файла C ++:
create-exercise: create-exercise.o
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
Тогда весь файл makefile будет:
CXXFLAGS = -Wall -std=gnu++17
create-exercise: create-exercise.o
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
create-exercise.o: exercise.hpp
Цель create-exercise
также становится целью по умолчанию, поскольку это первое правило в файле makefile. Это цель для сборки, если вы не укажете make
.