Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Makefile将来自不同目录的源文件构建到同一个对象目录中_C_Makefile_Gnu Make - Fatal编程技术网

C Makefile将来自不同目录的源文件构建到同一个对象目录中

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),

我有一个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_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

$