Постоянный ввод длинных команд gcc — это мучение. Ситуация усугубляется, когда вы постоянно добавляете библиотеки или вносите изменения в код. Makefile решают эту проблему. Они автоматизируют процесс сборки, избавляя вас от необходимости снова и снова вводить одни и те же команды.
Ниже приведен простой пример Makefile. Он заменяет ручную последовательность компиляции.
Сохраните этот код в файл с именем makefile. Запустите make для сборки исполняемого файла. Существует одно строгое правило. Перед каждой строкой с gcc должен стоять символ табуляции. Восемь пробелов приведут к ошибке. Инструмент сборки отклонит такой файл. Все остальные строки должны начинаться с левого поля.
Понимание зависимостей
В Makefile есть два типа строк. Строки, начинающиеся с левого поля, — это строки зависимостей. Они определяют отношения между файлами. Строки, отступленные табуляцией, — это исполняемые команды. Это могут быть любые допустимые команды UNIX.
Рассмотрим эту строку:
main.o: main.c util.h
Это означает, что main.o зависит от main.c и util.h. Если любой из исходных файлов изменится, выполнится команда, следующая за ней. Она пересоздаст main.o.
Первая строка в файле является специальной. Она определяет конечную цель (target). В данном случае это исполняемый файл main. В ней перечислены зависимости main.o и util.o. Если эти объектные файлы новее исходных, Make пересоберет их. Затем он свяжет их в итоговый бинарный файл.
Эта команда выполняется только в том случае, если изменились зависимости. Если ничего не изменилось, Make ничего не делает. В этом заключается основное преимущество. Он пропускает работу, которая уже выполнена.
Почему это важно для вашего рабочего процесса
В больших программах много библиотек и исходных файлов. Вручную отслеживать, какие файлы изменились, легко ошибиться. Makefile делает это автоматически. Он пересобирает только то, что необходимо. Вы изменили один заголовочный файл. Make пересоберет все исходные файлы, которые его включают. Вы изменили вспомогательную функцию. Make пересоберет только этот объектный файл и заново свяжет исполняемый файл.
Вам не обязательно находиться в системе UNIX, чтобы использовать эту логику. Большинство современных компиляторов и сред разработки (IDE) включают аналогичные функции. Проверьте документацию вашего компилятора. Ищите инструменты автоматизации сборки. Они работают одинаково на внутреннем уровне.
Это возвращает нас к заголовкам вроде stdio.h. В предыдущих примерах вы включали их, не объясняя, зачем. Это стандартные библиотеки. Кто-то написал их много лет назад. Они были предоставлены вам, чтобы избавить от необходимости заново изобретать базовые функции. Makefile и стандартные библиотеки являются частью одной философии. Они позволяют вам сосредоточиться на логике, а не на шаблонном коде.
Инструмент настолько хорош, насколько хороши его правила. Если ваши зависимости указаны неверно, Make не пересоберет то, что должен. Или, что еще хуже, он соберет устаревший код. Проверьте символы табуляции. Убедитесь в правильности имен файлов. Правильно задайте синтаксис, и компилятор возьмет на себя основную работу.
Вы можете задаться вопросом, когда ручная компиляция может быть быстрее. Для одного файла — возможно. Но как только вы вносите изменения в заголовочный файл в проекте с множеством файлов, ручной метод проигрывает. Вы начинаете копировать команды. Вы начинаете допускать опечатки. Вы начинаете гадать, почему main.o не был обновлен.
Переход от ввода команд к определению правил — это реальная выгода. Вы определяете состояние. Инструмент обеспечивает переходы. Это небольшое изменение в привычках. Оно окупается при каждой последующей сборке.

























