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