#makefile #gnu-make
#makefile #gnu-make
Вопрос:
Как в лекции 1 по CS50, так и в этом старом видео GDB CS50, которое они используют make
без какого-либо makefile
предварительного присутствия, и оно вызывает clang
с несколькими аргументами. Однако, когда я запускаю, make
кажется, что он использует cc
.
Я полагал, что это должно было означать, что при каждом моем запуске makefile
используется значение по умолчанию make
. Я проверил make
документы и не смог найти ничего, подтверждающего мою теорию. Однако в онлайновом документе для GNU make
есть строка:
Если вы не используете флаг
‘-f’
или‘--file’
, по умолчанию выполняется попыткаGNUmakefile
,makefile
иMakefile
в таком порядке и используется первый из этих трех, который существует или может быть создан.
В конце этого он направляет меня к другому разделу, в котором говорится:
Если
make
не находит ни одного из этих имен, он не использует никакой makefile. Затем вы должны указать цель с помощью аргумента команды иmake
попытаетесь выяснить, как ее переделать, используя только встроенные неявные правила.
Вот примеры скриншотов обоих видео:
Это то, что make
может сделать?
Комментарии:
1. Почитайте о неявных правилах — это должно предоставить много информации о том, что
make
делается в таких случаях.
Ответ №1:
Make имеет ряд встроенных правил, которые используют ряд переменных по умолчанию, которые используются, если makefile не существует (или если makefile существует, но не переопределяет эти встроенные правила или переменные другими).
Однако встроенные значения по умолчанию всегда должны использоваться cc
для компилятора C, и компилятору вообще не предоставляются флаги, за исключением basic -o
и -c
.
Однако значения этих переменных по умолчанию могут быть переопределены переменными среды. Итак, если это действительно так, что makefile отсутствует, но все же используются эти дополнительные флаги, возможно, они определили некоторые переменные среды, такие как:
export CC=clang
export CFLAGS='....'
(Я не смог скопировать и вставить флаги с вашего скриншота, и у меня не было желания перепечатывать, так что вам придется их представить).
Кроме того, имейте в виду, что они могли установить MAKEFILES
переменную окружения так, чтобы она указывала на makefile или набор makefiles, которые будут прочитаны, даже если локального makefile не существует.