makefile在其他目录中包含* .h文件

由于* .o,*。h文件和* .c文件存储在不同的目录中,每次写* .o或* .h文件时是否需要添加前缀$(ODIR)或$(IDIR)?

有一种优雅的方式吗?

也许某种方式像$(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建议之外,GNU make的vpath指令可以帮助您:

 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和所需目录。 您可以对包含执行相同操作,也可以使用通配符,如图所示。