c - 将目标文件存储在构建目录中 (Makefile)

标签 c makefile

我知道这个问题已经被问了很多,我已经查看了几个回复,但无法弄清楚哪里出了问题。我试图将所有目标文件存储在构建目录中。在根文件夹中,我有我的 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/

相关文章:

c - 扩充现有的 Makefile

c++ - ld : foo. o :foo. h :6 multiple definition of `bar' foo. h:6: 首先在这里定义

makefile - Makefile 中 .PHONY 的用途是什么?

c++在我的makefile中包括特征

c++ - 库函数 objdump 输出

c - 段错误 - 文件写入

将输入从 int 转换为 double

linux - 制作 : -c: Command not found

c - 如何高效计算 2 的大幂?

C 段错误 xor char 数组