Если вы проверите руководство по сборке GNU Как сделать Процессы Makefile , вы заметите следующее предложение:
make читает make-файл в текущем каталоге и начинает с обработкипервое правило.
Далее в следующем абзаце:
Если какое-либо другое правило не зависит от цели (или чего-либо, от чего зависит, и т. д.),это правило не обрабатывается, если вы не укажете make сделать это (с помощью команды, такой как make clean).
Здесь ваше первое правило гласит, что нужно построить good_echo.s
, и ни одна из других целей не является предварительным условием этого, поэтому это единственная построенная.
Если вы запустите make good_echo
тогда все будет построено.В качестве альтернативы вы можете убедиться, что правило для создания цели good_echo
является правилом first в вашем make-файле.
Или вы можете использовать часто используемую идиому и создать цель all
как первое правило, которое зависит от того, что вы хотите сгенерировать:
all: good_echo
Для ясности, кроме первого правила в make-файле, не важно, в каком порядке определены правила.
ETA
Как указал Джозеф Куинси в комментариях, ваше правило здесь:
good_echo.o: good_echo.s
gcc -S good_echo.s -o good_echo.o
неверно.Опция -S
указывает компилятору останавливаться после генерации сборки и записывать ее, но уже иметь сборку в качестве ввода.Вам нужен объектный файл, поэтому вы должны использовать опцию -c
, чтобы заставить компилятор остановиться после генерации объектного файла (а не пытаться связывать):
good_echo.o: good_echo.s
gcc -c good_echo.s -o good_echo.o
Чтобы быть более понятным: компиляторможно определить, какой тип input задан, используя расширение файла (в данном случае .s
означает сборку) - или вы можете принудительно установить его с помощью опции -x
, если хотите, - ноон не будет выводить тип output , который вы хотите: вы всегда должны указывать это с такими параметрами, как -c
, -S
и -E
.Если вы не используете ни один из них, он выполнит все шаги и попытается сгенерировать исполняемую программу.