Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C makefile在其他目录中包含*.h文件_C_Makefile - Fatal编程技术网

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

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

由于*.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 = ../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,情况并非如此,所以我从未看到过这个错误。谢谢