Вывод Make представляет команды, которые он запускает. По крайней мере, для последовательной сборки это однозначно сообщает, какая команда произвела каждое сообщение диагностики c. В вашем случае команда, вызвавшая ошибку, сразу же предшествует ей в выводе:
gcc -std=gnu99 -Wall -I./src -I./src/app -I./src/include -I./src/lib -o bin/Main
Так что же с этим не так? Почему именно то, что говорит диагностика c: в нем не указаны входные файлы для работы. Нет C исходных файлов для компиляции, нет объектных файлов или библиотек для ссылок. Ничего, из чего можно создать указанный выходной файл.
Предположим, что вы представили полный make-файл, который создает для вас проблему, эта команда должна исходить из попытки создать цель all
с помощью этого правила:
all: $(DEPEND_LST)
$(COMP_ARGS)
Это немного подозрительно, потому что цель all
обычно предоставляет только список предварительных условий, а не рецепт. Каждое предварительное условие, которое может потребоваться построить, будет иметь свое собственное правило. Но по сути не является неправильным предоставление рецепта, и мы должны рассмотреть сам рецепт, чтобы определить природу вашей проблемы. В этом случае у нас есть подозрительный момент № 2: рецепт определяется целиком через одну переменную. Но я уже знал это, потому что мне пришлось проследить это, чтобы сначала определить это правило как источник ошибки.
В частности, единственное место, где текст bin/Main
появляется в make-файле. находится в этом else
блоке:
else
DEPEND_LST := apps
COMP_ARGS := $(CC) $(CFLAGS) $(INCLUDE_ALL) $(OBJECTS) -o bin/Main
endif
Это действительно обеспечивает переменную командной строки, на которую ссылается цель all
(и ничто иное), и она точно совпадает с командой, которая вызывает ошибку , И что мы находим, когда сопоставляем биты командной строки с переменными, из которых построена эта версия COMP_ARGS
? Мы обнаруживаем, что все биты покрыты переменными, отличными от OBJECTS
, которые, очевидно, расширяются до нуля (вы даже можете видеть отдельные символы начального и конечного пробелов вокруг его пустого значения). И почему OBJECTS
расширяется до пустого значения? Поскольку никогда не устанавливается , когда выполняется эта ветвь условного выражения.
Лично я был бы склонен переписать весь make-файл, чтобы он был более идиоматическим c и меньше полагался на GNU make
расширений, но простейшим шагом вперед, вероятно, было бы поместить соответствующее определение переменной OBJECTS
в блоке else
, на который я указал.