Учебники

Makefile — Перекомпиляция

Программа make — это интеллектуальная утилита, которая работает на основе изменений, которые вы делаете в своих исходных файлах. Если у вас есть четыре файла main.cpp, hello.cpp, factorial.cpp и functions.h, то все остальные файлы зависят от functions.h, а main.cpp зависит как от hello.cpp, так и factorial.cpp. Следовательно, если вы сделаете какие-либо изменения в functions.h, то make перекомпилирует все исходные файлы для генерации новых объектных файлов. Однако, если вы сделаете какие-либо изменения в main.cpp, так как это не зависит ни от какого другого файла, то перекомпилируется только файл main.cpp, а help.cpp и factorial.cpp — нет.

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

Избегать перекомпиляции

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

Если вы предвидите проблему до изменения заголовочного файла, вы можете использовать флаг `-t ‘. Этот флаг указывает make не запускать команды в правилах, а помечать цель как актуальную, изменяя дату ее последнего изменения. Вы должны следовать этой процедуре —

  • Используйте команду `make ‘для перекомпиляции исходных файлов, которые действительно нуждаются в перекомпиляции.

  • Внесите изменения в заголовочные файлы.

  • Используйте команду `make -t ‘, чтобы пометить все объектные файлы как актуальные. В следующий раз, когда вы запустите make, изменения в заголовочных файлах не вызовут никакой перекомпиляции.

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

Внесите изменения в заголовочные файлы.

Используйте команду `make -t ‘, чтобы пометить все объектные файлы как актуальные. В следующий раз, когда вы запустите make, изменения в заголовочных файлах не вызовут никакой перекомпиляции.

Если вы уже изменили заголовочный файл в то время, когда некоторые файлы нуждаются в перекомпиляции, сделать это слишком поздно. Вместо этого вы можете использовать флаг `-o file ‘, который помечает указанный файл как« старый ». Это означает, что сам файл не будет переделан, и больше ничего не будет переделано на его счет. вам нужно следовать этой процедуре —

Перекомпилируйте исходные файлы, которые нужно компилировать по причинам, независимым от конкретного заголовочного файла, с помощью `make -o header file ‘. Если задействовано несколько файлов заголовков, используйте отдельный параметр `-o ‘для каждого файла заголовков.

Обновите все объектные файлы с помощью `make -t ‘.