Операционные системы. Теория и практика. Замятин А.В. - 212 стр.

UptoLike

Составители: 

212
ции M и MM). В другом случае компиляция происходит как обычно,
только в дополнении к объектному файлу генерируется еще и файл за-
висимостей (опции MD и MMD). Предпочтительней использовать вто-
рой вариант, т. к.
1) при изменении какого-либо из исходных файлов будет построен
заново лишь один соответствующий ему файл зависимостей;
2) построение файлов зависимостей происходит «параллельно» с
основной работой компилятора и практически не отражается на времени
компиляции.
Из двух возможных опций, MD и MMD, предпочтительней первая,
т. к. с помощью директивы «#include <имя_файла>» часто включаются
не только «стандартные» апример «#include <iostream.h>»), но и свои
собственные заголовочные файлы, которые могут иногда меняться
апример, «#include «myclass.h»).
После того как файлы зависимостей сформированы, они имеют
расширение «d». Для того, чтобы сделать их доступными утилите make,
следует использовать директиву #include:
include $(wildcard *.d)
Следует обратить внимание на использование функции wildcard,
т. к. конструкция
include *.d
будет правильно работать только в том случае, если в каталоге будет
находиться хотя бы один файл с расширением «d». Если таких файлов
нет, то make аварийно завершится, т. к. потерпит неудачу при попытке
«построить» эти файлы. Если же использовать функцию wildcard, то при
отсутствии искомых файлов эта функция просто вернет пустую строку.
Далее, директива include с аргументом в виде пустой строки, будет про-
игнорирована, не вызывая ошибки. Теперь новый вариант makefile из
этого примера выглядит следующим образом:
iEdit: $(patsubst %.cpp,%.o,$(wildcard *.cpp))
gcc $^ -o $@
%.o: %.cpp
gcc -c -MD $<
include $(wildcard *.d)
Файлы с расширением «d» это сгенерированные компилятором
gcc файлы зависимостей. Вот, например, как выглядит файл Editor.d, в
котором перечислены зависимости для файла Editor.cpp:
Editor.o: Editor.cpp Editor.h TextLine.h