При отсутствии явного правила для foo.o
, make попытается создать неявные шаблонные правила, чтобы попытаться построить его для вас (для простоты мало дополнительных шагов пропущено), и когда у него заканчиваются идеи, он потерпит неудачу иотобразить сообщение об ошибке, которое вы видите.
Другими словами.В вашем случае make не может ни найти foo.o
, ни собрать.Вероятно, он искал бы foo.c
, foo.cpp
, foo.C
, ... Вы можете получить полный список, запустив make
с --debug=i
.
. Вы должны убедиться, что всеисходные коды доступны для всех файлов, которые, как ожидается, будут связаны с основными (т. е. для которых могут быть созданы $(OBJECTS)
объектные файлы).Или уменьшите этот список до фактически доступного и необходимого списка файлов.
Также обратите внимание, что после устранения этого препятствия ваш make-файл не будет связывать ваш исполняемый файл, потому что:
main: $(OBJECTS)
$(CXX)
Как только всепредварительные условия доступны, и main
может быть построен, он просто запустит g++
и завершится ошибкой, потому что никакие входные данные не указаны, как минимум, вы, вероятно, захотите сказать что-то вроде:
main: $(OBJECTS)
$(CXX) -o $@ $+
Для запускаg++
с использованием целевого имени (main
) для вывода и всех предпосылок ($(OBJECTS)
) в качестве входных данных.