Почему мы используем команду «make», когда «cc ex1.c -o ex1» компилирует код, написанный в файле «exe1.c» - PullRequest
2 голосов
/ 03 октября 2019

Я изучал программирование на С в Linux, когда натолкнулся на эту строчку кода

$ make ex1

cc ex1.c -o ex1

Мой вопрос: почему мы должны использовать make ex1? Разве команда cc не создает программу и другие необходимые файлы.

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

За исключением небольшого набора очень простых задач, почти все реальные программы на C будут созданы из нескольких модулей, заголовочных файлов, внешних библиотек, иногда охватывающих несколько папок. В некоторых случаях дополнительный код может быть связан с использованием различных инструментов (например, генераторов кода).

В этих случаях одиночная команда 'cc' не будет работать. Следующим решением будет автоматизировать сборку с использованием сценария сборки. Тем не менее, сборка может занять много времени и практически невозможна для обслуживания.

Для сборки программ на языке "С" Make предоставляет множество преимуществ поверх простого сценария сборки оболочки. Это моя личная "топ-3"

  • Инкрементная сборка - при изменении файлов кода make может идентифицировать выполнение минимального набора инструкций по сборке вместо перекомпоновки всего кода. Это может значительно повысить эффективность работы разработчиков.
  • Сборка на основе правил - make использует правила для создания целей. Как только вы определите правило (одно очевидное правило: скомпилируйте файл «.c» в «.o»), их можно применять последовательно ко всем файлам.
  • обеспечивает настройку для полного процесса сборки, включая установку кода, очистка, упаковка, тестирование и т. д. Очень важно, чтобы make мог интегрировать (почти) любой инструмент Unix в процесс сборки - генерацию кода и т. д.

Излишне говорить, что есть и другие инструменты сборкикоторые предоставляют дополнительные / альтернативные преимущества. CMake, gradle, SCons и многие другие.

1 голос
/ 03 октября 2019

Для проекта с одним файлом они примерно одинаковы. Тем не менее, реальные проекты, как правило, имеют десятки, сотни или тысячи файлов и создают десятки или сотни библиотек и исполняемых файлов, возможно, с различными настройками и т. Д. Управлять всем этим без сохранения команд компиляции где-либо было бы невозможно, и Makefileочень полезно "где-то".

Еще одно важное свойство make состоит в том, что он проверяет временные метки на файлах и перезапускает только команды компиляции / компоновки, выходные данные которых устарели, т.е. по крайней мере один из их входных данных являетсяновее чем выходы. Без таких проверок вам пришлось бы вручную помнить, какие файлы перекомпилировать при изменении чего-либо (особенно сложно, когда измененный файл является заголовком), или всегда перекомпилировать все, увеличивая время сборки на порядки.

...