C 在生成目录(Makefile)中存储对象文件

C 在生成目录(Makefile)中存储对象文件,c,makefile,C,Makefile,我知道这已经被问了很多,我已经看了一些回答,但不能找出什么是错的。我正在尝试将所有对象文件存储在生成目录中。在根文件夹中,我有我的Makefile和以下目录:include、bin、build、src和rsrc。我希望对象文件存储在build目录中,可执行文件存储在bin中。这是我的Makefile CFLAGS = -Wall -Werror DIRS = -I $(IDIR) -I $(SRCDIR) -I $(ODIR) IDIR = include SRCDIR = src ODIR

我知道这已经被问了很多,我已经看了一些回答,但不能找出什么是错的。我正在尝试将所有对象文件存储在生成目录中。在根文件夹中,我有我的Makefile和以下目录:include、bin、build、src和rsrc。我希望对象文件存储在build目录中,可执行文件存储在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)
CFLAGS=-Wall-Werror
DIRS=-I$(IDIR)-I$(SRCDIR)-I$(ODIR)
IDIR=包括
SRCDIR=src
ODIR=构建
DEPS=include/map\u reduce.h include/const.h
BINS=mapreduce
全部:$(垃圾箱)
_OBJ=映射_reduce.o main.o
OBJ=$(patsubst%,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o:%.c$(DEPS)
gcc-c-o$@$<$(CFLAGS)
mapreduce:$(OBJ)
gcc$(CFLAGS)$(目录)$^-o$@
清洁:
rm-f*.o$(箱子)
我目前没有在bin文件夹中存储可执行文件的规则,但我想如果我能理解如何在build中存储对象文件,那么这一部分应该不难

我收到错误“没有规则使目标构建/map\u reduce.o成为mapreduce所需”

任何有助于我理解这里发生的事情的见解都将不胜感激

考虑一下这条规则:

$(ODIR)/%.o: %.c $(DEPS)
    gcc -c -o $@ $< $(CFLAGS)
考虑一下这条规则:

$(ODIR)/%.o: %.c $(DEPS)
    gcc -c -o $@ $< $(CFLAGS)

您使用的是哪个
make
?首先,按宏定义的使用顺序放置宏定义。其次,当宏定义不更改时,请使用
:=
而不是
=
。第三,变量名(包括宏名)以
\uuu
开头,后跟大写字母,以
\u
开头,这是为系统保留的,用户不应该用
\u OBJ
@user3629249这样的名称污染系统名称空间,很明显,他正在使用gmake(gnu make)因为%后缀表示法是它的扩展。我不清楚的是,是否可以添加更多依赖项(就像他在
$(ODIR)/%.o:%.c$(DEPS)
中所做的那样),或者他必须使依赖项不以不同的规则模板化。您使用的是哪个
生成的
?首先,按使用顺序放置宏定义。其次,当宏定义不更改时,请使用
:=
而不是
=
。第三,变量名(包括宏名)以
\uuu
开头,后跟大写字母,以
\u
开头,这是为系统保留的,用户不应该用
\u OBJ
@user3629249这样的名称污染系统名称空间,很明显,他正在使用gmake(gnu make)因为%后缀表示法是它的扩展。我不清楚的是,是否可以添加更多依赖项(如他在
$(ODIR)/%.o:%.c$(DEPS)
中所做的),或者他必须使依赖项不以不同的规则模板化。