Как сделать сборку исполняемого файла из исходного файла C, если неявное правило ничего не говорит об исполняемых файлах? - PullRequest
0 голосов
/ 17 апреля 2019

Из GNU Make Manual Я понимаю, что для .c программ существует неявное правило:

n.o производится автоматически из n.c по рецепту в форме ‘$ (CC) $ (CPPFLAGS) $ (CFLAGS) -c’

Когда, например, я набираю make helloworld и в моем рабочем каталоге есть только файл helloworld.c, я вижу, что выполняется следующее:

cc helloworld.c -o helloworld

Если я наберу make -d helloworld, я вижу, что make никогда не ищет промежуточный файл helloworld.o.

В конце я не вижу файл .o в своем каталоге, только исполняемый файл. Как make создает исполняемый файл из исходного файла, если неявное правило для программы .c говорит, что оно должно создавать файл .o?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Существуют разные неявные правила во встроенной базе данных.И make никогда не возражает, если правила шаблона неоднозначны, так как он всегда устанавливает для них приоритеты.

В этом случае правила %: %.o и %.o: %.c заменяются правилом %: %.c (посколькуодин шаг лучше двух ;-)), который выполняет компиляцию в исполняемый файл без создания объектных файлов (да, gcc может сделать это).

Однако вы можете принудительно создать .o с помощью этой команды:

make helloworld.o helloworld

Здесь, после успешного создания helloworld.o, make предпочтет правило %: %.o вместо %: %.c, поэтому оно работает как положено.

1 голос
/ 17 апреля 2019

Есть много неявных правил.В этом случае есть один для сборки исполняемого файла непосредственно из файла C.В выводе make -d helloworld вы должны увидеть что-то вроде:

Попытка неявного пререквизита 'helloworld.c'.

Найдена неявное правило для 'helloworld'.

...