Ошибка связана с тем, что ваш Makefile хочет генерировать исполняемый файл и файлы в подкаталоге bin
объекта, но не содержит правила, чтобы гарантировать, что bin
существует тогда, когда это необходимо . Как @JonathanLeffler комментирует, вы можете решить это , просто создав вручную bin
.
Но часто желательно, чтобы сам Makefile обеспечит что подкаталог, или какой-либо другой ресурс, существует тогда, когда он нужен, и вы, вероятно, предполагается, что модель властвуй
bin/%.o: %.c
бы создать bin
при необходимости. Это не так.
Ваш Makefile может обеспечить существование bin
если вы изменить его следующим образом:
Где-то ниже all
правило, добавить новую цель:
bin:
mkdir -p [email protected]
Это сделать подкаталог bin
если его не существует.
Затем измените правило:
bin/%.o: %.c
$(CC) $(CFLAGS) -c -o [email protected] $<
к:
bin/%.o: %.c | bin
$(CC) $(CFLAGS) -c -o [email protected] $<
Дополнительный | bin
является примером order-only prequisite Это означает: Если какой-либо из целей (в bin/%.o
вещей) необходимо быть переделанным из любого из предшествующих предварительных требований (до |
, то есть %.c
вещей), то bin
должно быть сделано первый. Итак, как только что-то должно быть сделано в bin
, сначала будет сделано bin
.
В вашем Makefile есть еще один основной недостаток. all
зависит от clean
, поэтому каждый раз, когда вы успешно создаете , ваша программа удаляет объектные файлы. Я понимаю, что вы намерены, но это совершенно поражений цели make
, которая является избежать необходимости восстановить все (объектные файлы, исполняемые) каждый времени, а не просто восстановление тех вещей, которые стали для улицы с учетом их предварительных условий.
all
Так не должно зависеть от clean
, а затем объектный файл будет перекомпилировать только тогда, когда он нуждается в к перекомпилировать, т.е. старше соответствующего исходного файла. Если и когда вы хотите очистить объектные файлы , запустите make clean
.
Наконец, ваше demo
правило:
demo:
../bin/main.exe
несовместима с другими. Остальные предполагают, что bin
, где находится исполняемый файл , находится в текущем каталоге. Правило demo
предполагает, что он находится в родительском текущей директории. Если вы исправите правило demo
, оно будет идентично правилу run
, поэтому оно является излишним, но если оно не было лишним, то оно должно быть добавлено к .PHONY
целям.
У вас есть подкаталог 'bin'? Если нет, создайте его и повторите команду 'make'. –
Да, данный подкатегория: 'ls bin main src test' – ishango
Держать; если исходный файл 'main.c' находится в' src', но компилятор находит его как 'main.c', тогда файл объекта должен перейти в' ../ bin/main.o', а не 'bin/main .o'. У вас есть папка 'bin' на верхнем уровне, но ваши команды запускаются на один уровень, поэтому вам нужно идти вверх (' ..'), прежде чем перейти в каталог 'bin'. Это проблема? –