Здесь есть два разных механизма для работы с заголовочными файлами:
Когда компилятор пытается собрать foo.o
из foo.c
, а в foo.c
он встречает #include "foo.h"
, он ищет foo.h
. Флаги -I
указывают, где искать. Если он вызывается без флагов, которые ему нужно найти foo.h
, он будет жаловаться и умрет.
Когда Make пытается собрать foo.o
и, рассматривая какое правило использовать, он смотрит на предварительные условия. Предпосылки для вашего правила foo.c foo.d foo.h
, поэтому он ищет эти предпосылки. Как узнать, где находится foo.h
? Обратите внимание, что флаг компилятора внутри одной из его команд бесполезен - он не будет делать никаких выводов по этому поводу. Если он не может найти (и не знает, как сделать) предварительное условие, он отклонит это правило и будет искать другое, такое как неявное правило %.o
, которое ничего не знает о вашей переменной $ (INCS), и это приводит вас к проблеме, описанной выше.
Если это проблема (и вы можете проверить, посмотрев на расположение заголовков и выполнив некоторые эксперименты), у вас есть несколько вариантов:
A) Вы можете использовать неявное правило и его переменные. Просто добавьте INCS
к CFLAGS
, и вы, вероятно, получите желаемый результат. Это говорит компилятору, что делать, но все равно оставляет Make в неведении относительно зависимостей, поэтому вам, вероятно, придется дважды проверить правильность обработки зависимостей.
B) Вы можете указать Make, где искать заголовочные файлы:
vpath %.h inc my/inc/path
(Вы можете заметить, что это избыточно с вашей переменной INCS
, а избыточность плохая - вы можете устранить эту избыточность, но я призываю вас сначала заставить ее работать.)