Makefile не генерирует объектный код или исполняемый файл - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь написать make-файл, который генерирует код сборки, объектный код и исполняемый файл из файла .c.Это содержимое моего make-файла:

good_echo.s: good_echo.c
    gcc -S -fstack-protector-all good_echo.c
good_echo.o: good_echo.s
    gcc -S good_echo.s -o good_echo.o
good_echo: good_echo.o
    gcc -v good_echo.o -o good_echo
clean:
    rm -f good_echo.o good_echo.s good_echo 

Когда я ввожу make в терминал, он генерирует только код сборки.Может кто-нибудь объяснить, что происходит?

1 Ответ

0 голосов
/ 11 октября 2018

Если вы проверите руководство по сборке 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.Если вы не используете ни один из них, он выполнит все шаги и попытается сгенерировать исполняемую программу.

...