В make-файле программы необходимо написать правила, определяющие зависимости каждого объектного файла. Рассмотрим объектный файл fileA.o
. Очевидно, что этот объектный файл зависит от исходного файла fileA.c
. Но это также будет зависеть от всех файлов заголовков, которые включает этот исходный файл. Поэтому в make-файл должно быть добавлено следующее правило:О файлах зависимостей GNU make * .d
# This rule states that fileA.o depends on fileA.c (obviously), but also
# on the header files fileA.h, fileB.h and fileC.h
fileA.o: fileA.c fileA.h fileB.h fileC.h
Обратите внимание, что правило не имеет рецепта. Можно было бы добавить к нему рецепт, но это, строго говоря, не обязательно, потому что GNU make может полагаться на неявное правило (с рецептом) для компиляции файла *.c
в файл *.o
.
В любом случае, написать такие правила вручную - это адская задача. Представьте себе, что работа по поддержанию правил makefile синхронизируется с операторами #include из исходного кода.
Руководство по GNU make описано в главе 4.14 «Автоматическое создание предварительных условий» - методология для автоматизации этой процедуры. Процедура начинается с генерации файла *.d
для каждого исходного файла. Цитирую:
Для каждого исходного файла name.c есть Makefile name.d который перечисляет, какие файлы объектный файл name.o зависит.
В пособии продолжается:
Вот шаблонное правило для создания файла предпосылок (т.е. Makefile) называется name.d из исходного C-файла под названием name.c :
%.d: %.c
@set -e; rm -f [email protected]; \
$(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o [email protected] : ,g' < [email protected]$$$$ > [email protected]; \
rm -f [email protected]$$$$
К сожалению, руководство не объясняет подробно, как на самом деле работает это правило. Да, он дает нужный файл name.d, но почему? Правило очень запутано.
При взгляде на это правило у меня возникает ощущение, что его рецепт будет работать ровно на Linux. Я прав? Есть ли способ сделать этот рецепт правильно запущен в Windows?
Любая помощь очень ценится :-)
Вау, большое вам спасибо за все объяснения. Я все еще полностью понимаю ваши объяснения. Но вы определенно дали мне большой импульс :-) –
Я использую компилятор GCC. Итак, есть более элегантный способ генерации зависимостей? Не могли бы вы описать это? Я немного стесняюсь спрашивать об этом, потому что я знаю, что это, вероятно, потребует много вашего времени. Но я был бы так благодарен :-) –
@ K.Mulier Добавил короткий пример. – user657267