我知道这个问题已经被问了很多,我已经查看了几个回复,但无法弄清楚哪里出了问题。我试图将所有目标文件存储在构建目录中。在根文件夹中,我有我的 Makefile 和以下目录:include、bin、build、src 和 rsrc。我希望目标文件存储在构建目录中,可执行文件存储在 bin 中。这是我的 Makefile。
CFLAGS = -Wall -Werror
DIRS = -I $(IDIR) -I $(SRCDIR) -I $(ODIR)
IDIR = include
SRCDIR = src
ODIR = build
DEPS = include/map_reduce.h include/const.h
BINS = mapreduce
all: $(BINS)
_OBJ = map_reduce.o main.o
OBJ = $(patsubst %, $(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
gcc -c -o $@ $< $(CFLAGS)
mapreduce: $(OBJ)
gcc $(CFLAGS) $(DIRS) $^ -o $@
clean:
rm -f *.o $(BINS)
我目前没有在 bin 文件夹中存储可执行文件的规则,但我想如果我能理解如何在构建中存储目标文件,那么这部分应该不难。
我收到错误“没有规则使 mapreduce 需要目标构建/map_reduce.o”
任何有助于我理解这里发生的事情的见解都将不胜感激!
最佳答案
考虑这个规则:
$(ODIR)/%.o: %.c $(DEPS)
gcc -c -o $@ $< $(CFLAGS)
它是一个模式规则(这是 GNU make 特有的特性),描述了如何基于一个文件构建一个名称为 $(ODIR)/%.o
的文件表单 %.c
和变量 $(DEPS)
中列出的各种文件。
但是,假设您的文件按照您描述的方式排列,并且您运行 make
时将包含 Makefile
的目录作为初始工作目录,则该规则永远不适用,即使需要构建的中间目标之一确实与该规则中的目标模式匹配。那是因为规则所表达的依赖并不都存在,make
无法确定任何构建缺失依赖的方法。
问题是您想要的依赖项存在于子目录中,但编写的规则期望 .c 文件直接存在于工作目录中。你想要更像这样的东西:
$(ODIR)/%.o: $(SRCDIR)/%.c $(DEPS)
gcc -c -o $@ $(DIRS) $(CFLAGS) $<
关于c - 将目标文件存储在构建目录中 (Makefile),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39378027/