我在尝试使用 make 将目标文件放在单独的子目录中时遇到了麻烦,这可能是一种非常基本的技术。我已经尝试使用这个页面中的信息: Http://www.gnu.org/software/hello/manual/make/prerequisite-types.html#prerequisite-types
我从 make 得到以下输出:
make: *** No rule to make target `ku.h', needed by `obj/kumain.o'. Stop.
然而,ku.h 是一个依赖项,而不是一个目标(尽管显然在 c 源文件中包含了 #)。当我不尝试为目标文件使用一个子目录时(例如,忽略 OBJDIR 部分) ,它工作得很好。为什么让我觉得 KU 是目标?
我的 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.然而,我现在得到了另一个问题(这是在我添加错误的 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 并没有为对象文件应用隐式规则,尽管手册中说 “隐式规则告诉 make 如何使用习惯技术,这样当你想使用它们时,你就不必详细指定它们。例如,有一个用于 C 编译的隐式规则。文件名决定运行哪些隐式规则。例如,C 编译通常采用。文件,并创建一个。档案。因此,当看到这种文件名结尾的组合时,make 应用了 C 编译的隐式规则。”还有“在 VPATH 中指定的目录或使用 VPATH 进行搜索时,也会考虑隐式规则(参见使用隐式规则)。”
这里再说一遍“例如,当一个文件 foo.o 没有显式规则时,make 考虑隐式规则,比如如果该文件存在,则编译 foo.c 的内置规则。如果工作目录中缺少这样的文件,就会搜索相应的目录。如果 foo.c 在任何目录中存在(或在 makefile 中提到) ,则应用 C 编译的隐式规则。”
如果您能帮助获得为我的 makefile 工作的隐式规则,我将不胜感激。
编辑2: 感谢 Jack Kelly,我制定了一个明确的规则来编译。文件,因为我不能得到任何地方试图使用隐式规则。还要感谢 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 $@
.PHONY : clean
clean :
rm $(objects)