我尝试使用make将目标文件放置在单独的子目录中,可能是非常基本的技术,但遇到问题。我曾尝试使用这些信息在本页面: http://www.gnu.org/software/hello/manual/make/Prerequisite-Types.html#Prerequisite-Types如何将目标文件放置在单独的子目录中
我从make以下的输出: 化妆:***没有规则,使目标ku.h', needed by
OBJ/kumain.o”。停止。
然而,ku.h是一个不依赖于目标的依赖项(虽然它明显包含在c源文件中)。当我不尝试使用目录文件的子目录(即错过OBJDIR部分)时,它工作正常。为什么认为ku.h是一个目标?
我的makefile是这样的:(风格读取各种信息源后)
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
VPATH=%.c src
VPATH=%.h src
VPATH=%.o obj
OBJDIR=obj
objects= $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o)
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(objects) : ku.h kudefines.h kuglobals.h kufns.h | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
.PHONY: clean
clean :
rm $(objects)
编辑: 我申请使用VPATH指令的变化。我的版本是VPATH = xxx和vpath%.c xxx的混合。然而,我现在又遇到了另一个问题(这是我添加错误vpath之前的原始问题)。这是现在的输出:
gcc -o ku -lhpdf obj/kumain.o obj/kudlx.o obj/kusolvesk.o ..etc
gcc: obj/kumain.o: No such file or directory
gcc: obj/kudlx.o: No such file or directory
gcc: obj/kusolvesk.o: No such file or directory
gcc: obj/kugetpuz.o: No such file or directory
gcc: obj/kuutils.o: No such file or directory
gcc: obj/kurand.o: No such file or directory
gcc: obj/kuASCboard.o: No such file or directory
gcc: obj/kuPDFs.o: No such file or directory
gcc: obj/kupuzstrings.o: No such file or directory
gcc: obj/kugensud.o: No such file or directory
gcc: obj/kushapes.o: No such file or directory
make: *** [ku] Error 1
看来,虽然手册上说 “潜规则告诉make如何使用常规技术,这样你就不必指定,让没有申请目标文件中的隐含规则例如,C编译有一个隐含的规则,文件名决定运行哪个隐式规则,例如,C编译通常需要一个.c文件并生成一个.o文件。当它看到这个文件名结尾的组合时,使用C编译的隐式规则。“还有“在VPATH或vpath中指定的目录中搜索也会在考虑隐式规则时发生(请参阅使用隐式规则)”。
再次在这里“例如,当一个文件foo.o没有明确的规则时,make会考虑隐式规则,如内置规则来编译foo.c,如果该文件存在。在当前目录中搜索相应的目录,如果任何目录中存在foo.c(或在makefile中提及),则应用隐含的C编译规则。
任何帮助获取隐式规则为我的生成文件工作将不胜感激。
编辑否2: 感谢杰克凯利我做了一个明确的规则编译.c文件,因为我无法在任何地方尝试使用隐式规则。还要感谢al_miro的vpath信息。
这里是工作makfile:
.SUFFIXES:
.SUFFIXES: .c .o
CC=gcc
CPPFLAGS=-Wall
LDLIBS=-lhpdf
OBJDIR=obj
vpath %.c src
vpath %.h src
objects = $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
kushapes.o)
ku : $(objects)
$(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)
$(OBJDIR) obj/%.o : %.c ku.h kudefines.h kuglobals.h kufns.h
$(CC) -c $(CPPFLAGS) $< -o [email protected]
.PHONY : clean
clean :
rm $(objects)
样式注意:'$(CPPFLAGS)'传统上用于C预处理标志,而'$(CFLAGS)采用'的编译器的标志。 –