C Makefile将来自不同目录的源文件构建到同一个对象目录中
我有一个c项目,目录布局如下C Makefile将来自不同目录的源文件构建到同一个对象目录中,c,makefile,gnu-make,C,Makefile,Gnu Make,我有一个c项目,目录布局如下 src1 -a.c -b.c src2 -c.c -d.c objects 我正在尝试将a/b/c/d编译成objects文件,并将它们保存到objects目录中,这是我的Makefile的一部分 src1 = src1/ src1 = src2/ obj = objects/ src1_files = a.c b.c src2_files = c.c d.c source_files = $(addprefix $(src1),
src1
-a.c
-b.c
src2
-c.c
-d.c
objects
我正在尝试将a/b/c/d编译成objects文件,并将它们保存到objects目录中,这是我的Makefile的一部分
src1 = src1/
src1 = src2/
obj = objects/
src1_files = a.c b.c
src2_files = c.c d.c
source_files = $(addprefix $(src1), $(src1_files)) $(addprefix $(src1), $(src2_files))
objects := $(addprefix $(obj), $(src1_files:.c=.o)) $(addprefix $(obj), $(src2_files:.c=.o))
$(obj)%.o: $(source_files)
$(CC) $(CFLAGS) -c $< -o $@
all: $(objects)
有人知道它为什么这样做吗?这不是模式规则的工作方式。当尝试用您的规则构建对象文件时,
make
尝试用与目标中的%
匹配的内容替换先决条件中的%
——但是您的先决条件不包含%
,因此它只是字面意思。在您的食谱中,您只需在阅读完,特别是最后一句之后,从先决条件列表($)中选择第一个
如果确实希望对象直接位于对象目录中,则需要两个模式规则,一个匹配src1
中的源,另一个匹配src2
中的源
我相应地修改了Makefile
(出于好奇):
…而且成功了
(我省略了有关构建对象的详细信息
目录–只是手动创建了它)。$(addprefix$(src1),$(src2_文件)
-->$(addprefix$(src2),$(src2_文件)
@Gaurav这还不够是的,这是我在阅读Makefile
时遇到的。我必须执行Makefile来捕捉任何其他问题。!:-|还有另一个输入错误:src1=src2/
(第二行)@Gaurav当然是正确的,但是这个Makefile除了拼写错误之外,还有一个概念性错误,它永远不会像这样工作;)是的,这就是我在上一段中简要描述的。我不推荐这种方法,至少如果源目录的数量以后会增加,但它是有效的:)(因此回答了眼前的问题)这是我想证明你的建议。可能是,我本应该更清楚地说明我的答案作为你的补充。我理解,只是想确认这是我的意思!(并补充怀疑这是“正确的做法”,但这当然取决于情况);)
gcc -Wall -c src1/a.c -o objects/a.o
gcc -Wall -c src1/a.c -o objects/b.o
gcc -Wall -c src1/a.c -o objects/c.o
gcc -Wall -c src1/a.c -o objects/d.o
objects := $(addprefix $(obj), $(source_files:.c=.o))
$(obj)%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
objdirs := $(obj)$(src1) $(obj)$(src2)
$(objdirs):
mkdir -p $@
$(obj)%.o: %.c | $(objdirs)
$(CC) $(CFLAGS) -c $< -o $@
src1 = src1/
src2 = src2/
obj = objects/
src1_files = a.c b.c
src2_files = c.c d.c
source_files = $(addprefix $(src1), $(src1_files)) $(addprefix $(src2), $(src2_files))
objects := $(addprefix $(obj), $(src1_files:.c=.o)) $(addprefix $(obj), $(src2_files:.c=.o))
$(obj)%.o: src1/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(obj)%.o: src2/%.c
$(CC) $(CFLAGS) -c $< -o $@
all: $(objects)
$ mkdir src1 src2 objects
$ touch src1/a.c src1/b.c src2/c.c src2/d.c
$ make
cc -c src1/a.c -o objects/a.o
cc -c src1/b.c -o objects/b.o
cc -c src2/c.c -o objects/c.o
cc -c src2/d.c -o objects/d.o
$