[Linux] инструмент автоматической сборки make/makefile


предисловие

В этой статье рассказывается об инструменте автоматической сборки под Linux: make/makefile.


以下是本篇文章正文内容

1. Что такое make/makefile?

  • 1.make это инструкция
  • 2.makefile — это файл в текущем каталоге

2. Зависимости и зависимые методы

2.1 Создание файлов в makefile

Приведенный выше код объясняет, какие зависимости и зависимые методы

1 mycode:mycode.c
2     gcc -o mycode mycode.c   

Сначала создайте и откройте make-файл и введите приведенный выше код.

  • Mycode первой строки кода находится слева от двоеточия, а mycode.c — справа от двоеточия Эта строка называется зависимостью .
    mycode зависит от mycode.c.
  • В начале второй строки кода клавиша Tab должна быть пустой, что является грамматическим требованием. Зависимость принадлежит называется зависимым методом .

Команда make автоматически сгенерирует соответствующую целевую исполняемую программу в соответствии с зависимостями и зависимыми методами.

Для дальнейшего объяснения зависимостей и зависимых методов следующий код приведен только для иллюстрации, и его не рекомендуется писать так:

  1 mycode:mycode.o
  2     gcc -o mycode mycode.o                                                      
  3 mycode.o:m mycode   
  4     gcc -o mycode.o -c mycode.s
  5 mycode.s:mycode.i
  6     gcc -o mycode.s -S mycode.i
  7 mycode.i:mycode.c
  8     gcc -o mycode.i -E mycode.c

Мы видим, что здесь есть несколько зависимостей и зависимых методов.
Среди них, когда мы выходим из make-файла и непосредственно выполняем команду make, ситуация выглядит следующим образом: вставьте сюда описание изображения
Это противоположно порядку зависимостей и зависимых методов, которые мы определили!
вставьте сюда описание изображения

На самом деле, когда команда make просматривает make-файл, она сначала находит первую исполняемую целевую программу, то есть mycode.Однако в текущем каталоге нет зависимости mycode: mycode.o, поэтому make продолжит сканирование вниз. , найти зависимость mycode.o: mycode.s, в текущем каталоге нет mycode.s, make продолжает сканирование вниз, найти зависимость mycode.s: mycode.i, в текущем каталоге нет mycode. i, затем продолжить поиск зависимостей mycode.i: mycode.c. В это время, если mycode.c будет найден, будет выполнен зависимый метод, соответствующий этой зависимости, то есть код в строке 8. С этого момента выполняйте шаг за шагом снизу вверх, пока не будет сгенерирован первый исполняемый объектный файл.
Итак, просто введите команду make, и первая зависимость будет найдена по умолчанию.

Поэтому мы можем нарушать порядок различных зависимостей и зависимых методов в make-файле, если он может быть найден командой make.

2.2 Удалить файлы в makefile

После того, как мы сгенерируем исполняемую программу, если я хочу удалить все файлы в этом процессе, я могу добавить зависимость и метод зависимости в make-файл для удаления файла.

 clean:
   	 rm -f mycode mycode.i mycode.s mycode.o

После выполнения команды make clean вышеуказанные файлы будут удалены.
вставьте сюда описание изображения
Видно, что когда мы завершим выполнение, все файлы mycode.i, mycode.s и mycode.o будут удалены.
Вот вопрос: Почему нужно вводить make clean вместо clean напрямую?
Поскольку команда make ищет первую зависимость по умолчанию

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

2.3 команда stat для просмотра трех видов времени файла (ACM)

Мы используем

стат мой код

команда, после проверки mycode будет три вида времени

вставьте сюда описание изображения
Время доступа (время доступа) Время изменения (время изменения) Время изменения: (время изменения)

Как отличить время модификации от времени изменения?
все еще помню

файл = содержимое файла + атрибуты файла

Время изменения — это обновление до последнего времени после изменения содержимого файла.
Время изменения обновляется до самого последнего времени после изменения атрибутов файла.

Доступ — это время доступа.Как правило, пока мы открываем файл, время доступа к файлу будет обновлено до последнего времени.

Так зачем делать несколько раз, это не позволяет выполнить?

Для повышения эффективности компиляции. Только исходный файл может быть выполнен, прежде чем его можно будет выполнить.Вообще говоря, время последней модификации исходного файла старше, чем исполняемая программа. Если мы меняем исходный файл и в истории была исполняемая программа, то время последней модификации исходного файла должно быть новее исполняемой программы!
Нужно только сравнить время последней модификации исходного файла и время последней модификации исполняемой программы:
(1) .exe старше, чем файл .c, и его необходимо перекомпилировать
(2) .exe новее, чем .c файл и не требует перекомпиляции

На самом деле, когда мы компилируем этот код в Linux, каждый раз, когда мы обращаемся к файлу .c, мы обнаружим, что Access не меняется каждый раз!

Причина: Потому что каждый раз, когда вы меняете значение Access, вам нужно обновлять его на диске. Частый доступ к периферийным устройствам только снизит эффективность всей машины. Для повышения эффективности разработчики Linux могут использовать Modify или Changed каждые несколько раз Изменено, Доступ будет обновлен.

Однако что, если я просто хочу, чтобы make выполнялся каждый раз?

2.4 Псевдообъектный файл (.PHONY)

Ниже приведен псевдоцелевой файл, который позволяет постоянно выполнять команду make.

вставьте сюда описание изображения
Видно, что когда мы добавляем исполняемый целевой файл после .PHONY:, каждый раз, когда мы выполняем make, он будет выполняться, а не выполняться, потому что файл .exe новее, чем файл .c.

Но на практике предлагается, чтобы код псевдообъекта: модифицировал clean с помощью .PHONY, чтобы всегда можно было выполнить clean.
Поскольку некоторые компиляторы используют метод инкрементной компиляции для добавленного кода, проблема с исходным файлом все еще может существовать, и нам нужно принудительно выполнить очистку, которая требует выполнения очистки каждый раз.

3. Некоторые специальные символы в Makefile

3.1 $@ и $^

вставьте сюда описание изображения

Иногда мы не хотим писать много чего в зависимом методе, поэтому символ "$@" может заменить все перед двоеточием в отношении зависимости, то есть он может заменить mycode в приведенном выше случае, " $ ^ "может заменить отношение зависимости, все после двоеточия, то есть mycode.o

вставьте сюда описание изображения

Так что это можно сделать так.

3.2 @ специальные символы

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

вставьте сюда описание изображения

Подведем итог

Сегодня я рассказал об инструментах автоматической сборки для Linux.

Guess you like

Origin blog.csdn.net/w2915w/article/details/131523255