makefile включает * .h файл в другой каталог

Поскольку файлы * .o, * .h и * .c хранятся в разных каталогах, мне нужно добавлять префикс $ (ODIR) или $ (IDIR) каждый раз, когда я пишу файл * .o или * .h?

Есть ли изящный способ сделать это?

Возможно, каким-то образом, как $ (IDIR) / {ah, bh, ch}?

Это образец файла makefile:

GCC = gcc CFLAGS = CFLAGS_DEBUG_STRICT = -Wall pedantic -ansi -ggdb -DDEBUG CFLAGS_DEBUG = -Wall -ggdb -DDEBUG LFLAGS = SDIR = ../src ODIR = obj IDIR = ../include INCLUDES = LIDR = ../lib/ LIBS = all : keyword_match_test keyword_match_test : $(ODIR)/keyword_match_test.o $(ODIR)/keyword_match.o $(GCC) $(CFLAGS_DEBUG) -o $@ $+ $(ODIR)/keyword_match_test.o : keyword_match_test.c $(IDIR)/keyword_match.h $(GCC) $(CFLAGS_DEBUG) -c -o $@ $< -I$(IDIR) $(ODIR)/keyword_match.o : $(SDIR)/keyword_match.c $(IDIR)/keyword_match.h $(IDIR)/global.h $(GCC) $(CFLAGS_DEBUG) -c -o $@ $< -I/usr/include/mysql -I$(IDIR) 

В дополнение к предложению @macs с явно размещенными объектными файлами директива Vpath GNU make может помочь вам:

 vpath %.h $(IDIR) vpath %.o $(ODIR) $(ODIR)/keyword_match_test.o : keyword_match_test.c keyword_match.h 

Вы можете сделать что-то вроде этого:

 C_SRC = foo.c bar.c C_OBJ = $(C_SRC:%.c=../obj/%.o) INCLUDES = $(wildcard *.hpp) $(wildcard *.h) $(wildcard ../../general/*.hpp) $(C_OBJ): $(C_SRC) $(C) $(CFLAGS) -o $(C_OBJ) -c $(C_SRC) 

Обратите внимание на ../obj/ в C_OBJ . Таким образом, вы передаете все исходные файлы в Makefile и автоматически заменяет расширения *.c на *.o и требуемый каталог. Вы можете сделать то же самое для включения или использовать подстановочный знак, как показано.