C 在生成目录(Makefile)中存储对象文件
我知道这已经被问了很多,我已经看了一些回答,但不能找出什么是错的。我正在尝试将所有对象文件存储在生成目录中。在根文件夹中,我有我的Makefile和以下目录:include、bin、build、src和rsrc。我希望对象文件存储在build目录中,可执行文件存储在bin中。这是我的MakefileC 在生成目录(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
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)
中所做的),或者他必须使依赖项不以不同的规则模板化。