C makefile在其他目录中包含*.h文件
由于*.o、*.h文件和*.c文件存储在不同的目录中,每次写入*.o或*.h文件时是否需要添加前缀$(ODIR)或$(IDIR) 有没有优雅的方法 也许有点像$(IDIR)/{a.h,b.h,c.h} 这是makefile的示例:C makefile在其他目录中包含*.h文件,c,makefile,C,Makefile,由于*.o、*.h文件和*.c文件存储在不同的目录中,每次写入*.o或*.h文件时是否需要添加前缀$(ODIR)或$(IDIR) 有没有优雅的方法 也许有点像$(IDIR)/{a.h,b.h,c.h} 这是makefile的示例: GCC = gcc CFLAGS = CFLAGS_DEBUG_STRICT = -Wall pedantic -ansi -ggdb -DDEBUG CFLAGS_DEBUG = -Wall -ggdb -DDEBUG LFLAGS = SDIR = ../s
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)
GCC=GCC
CFLAGS=
CFLAGS_DEBUG_STRICT=-Wall pedantic-ansi-ggdb-DDEBUG
CFLAGS_DEBUG=-Wall-ggdb-DDEBUG
LFLAGS=
SDIR=../src
ODIR=obj
IDIR=../include
包括=
LIDR=../lib/
LIBS=
全部:关键字匹配测试
关键字匹配测试:$(ODIR)/关键字匹配测试.o$(ODIR)/关键字匹配.o
$(GCC)$(CFLAGS_DEBUG)-o$@$+
$(ODIR)/关键字匹配测试.o:关键字匹配测试.c$(IDIR)/关键字匹配.h
$(GCC)$(CFLAGS_DEBUG)-c-o$@$<-I$(IDIR)
$(ODIR)/关键字匹配.o:$(SDIR)/关键字匹配.c$(IDIR)/关键字匹配.h$(IDIR)/global.h
$(GCC)$(CFLAGS_DEBUG)-c-o$@$<-I/usr/include/mysql-I$(IDIR)
您可以执行以下操作:
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)
注意
C_obj
处的。/obj/
。因此,您将所有源文件都提供给Makefile,它会自动将扩展名*.c
替换为*.o
和所需的目录。您可以对include执行相同的操作,或者使用通配符,如图所示。除了对明确放置的对象文件使用@macs建议外,GNU make的vpath指令还可以帮助您:
vpath %.h $(IDIR)
vpath %.o $(ODIR)
$(ODIR)/keyword_match_test.o : keyword_match_test.c keyword_match.h
您的规则使每个对象文件依赖于所有源文件,并且配方中的命令将失败,因为
-o
标志只接受一个参数,因此编译器将尝试将以下所有对象文件解释为源文件。好的,很高兴知道。。。我从未意识到。对于这个特定的Makefile,情况并非如此,所以我从未看到过这个错误。谢谢