Правила Makefile по сравнению с исходными и объектными файлами

Я изучаю, как работает make, и столкнулся с небольшой странностью

Предположим, у меня есть папка только с «helloworld.c» и «Makefile».

Makefile содержит

helloworld: helloworld.o
    gcc -o helloworld helloworld.o

Вывод make в консоли bash:

cc -c -o helloworld.o helloworld.c

gcc -o helloworld helloworld.o

Правило «helloworld» зависит от файла «helloworld.o», которого нет, поэтому make создает его (первая строка в выводе).

Но почему?

Я бы ожидал, что он потерпит неудачу из-за отсутствия правила «helloworld.o:», которое сообщает ему, как компилировать указанный файл. Почему он запускает первую команду по собственной воле?

Спасибо


person mfloris    schedule 03.05.2016    source источник
comment
В этом случае вам даже не нужен make-файл, поскольку неявные правила уже охватывают цель, у которой есть исходный файл (с известным суффиксом) с той же основой, попробуйте удалить ваш make-файл и просто запустить make helloworld.   -  person user657267    schedule 03.05.2016
comment
Как ответил Эдгар. Попробуйте make -r (или make --no-builtin-rules), чтобы отключить неявные правила, что теоретически должно вызвать ошибку, которую вы ожидаете. Если документация make сбивает вас с толку, рассмотрите несколько альтернатив make (BSD make, cmake, scons, jam и т. д.). Документация IME make огромна и все еще умудряется быть довольно бедной.   -  person Dummy00001    schedule 04.05.2016
comment
Обычно я использую по крайней мере make -Rr, чтобы избавиться от неявных правил (вам нужно только одно из r или R, но я никак не могу вспомнить, какое). Я не любитель узоров. (--warn тоже жутко полезен; жаль, что нет соответствующего --error, очень бы хотелось.)   -  person bobbogo    schedule 19.05.2016


Ответы (1)


Причина в неявных правилах.

Из руководства GNU Make:

Неявные правила сообщают make, как использовать обычные методы, поэтому вам не нужно подробно указывать их, когда вы хотите их использовать. Например, существует неявное правило для компиляции C. Имена файлов определяют, какие неявные правила выполняются. Например, компиляция C обычно берет файл .c и создает файл .o. Таким образом, make применяет неявное правило для компиляции C, когда видит эту комбинацию окончаний имен файлов.

Другими словами, make знает, как собрать helloworld.o из helloworld.c, даже если вы не укажете соответствующее правило.

Чтобы получить больше информации по этому вопросу, вы можете следовать руководству GNU Make, особенно раздел 10, который посвящен использованию неявных правил.

person Edgar Rokjān    schedule 03.05.2016
comment
Спасибо, что указали мне на нужный раздел руководства (оно огромное!). - person mfloris; 03.05.2016