相应c文件的makefile自动变量

时间:2016-04-13 22:47:53

标签: makefile

我有一个像这样的makefile:

 outdir = release
 allsrc = aaa/a.c bbb/b.c ccc/c.c
allobjs = $(addprefix $(outdir), $(notdir $(allsrc:.c=.o))
...
test: $(allobjs)

$(allobjs): $(allsrc)
        gcc -c -o $@ $<

让测试执行:

gcc -c -o release/a.o aaa/a.c
gcc -c -o release/b.o aaa/a.c
gcc -c -o release/c.o aaa/a.c

(自动变量$&lt;始终采用第一个先决条件) 但我希望&#34;相应的一个&#34;:

gcc -c -o release/a.o aaa/a.c
gcc -c -o release/b.o bbb/b.c
gcc -c -o release/c.o ccc/c.c

我应该改变什么以达到理想的结果?

我知道这肯定会有效:

$(outdir)/a.o: aaa/a.c
        gcc -c -o $@ $<

$(outdir)/b.o: bbb/b.c
        gcc -c -o $@ $<

$(outdir)/c.o: ccc/c.c
        gcc -c -o $@ $<

并想知道如何在一个收据中完成相同的操作。 (因为在我真正的makefile中,我有~20个不同的源文件,而不仅仅是像我在这里做的那样3个)

2 个答案:

答案 0 :(得分:2)

你不会那样写你的食谱。这不是如何使作品。

该食谱表明$(allobjs)中的每个项目都以$(allsrc)中的 项为先决条件,但这不是您的意思。

您的意思是每个.o文件都有匹配的.c文件作为其先决条件,完全内置%.o: %.c规则已经执行的操作。你甚至不需要一个makefile来做到这一点。

编辑:其实,你不是那个意思。我错过了源文件位于不同的目录中。这会改变并使事情复杂化。

Chris Dodd wrote up两个很好的解决方案。

答案 1 :(得分:1)

通常的做法是:

outdir = release
allsrc = aaa/a.c bbb/b.c ccc/c.c
allobjs = $(addprefix $(outdir), $(notdir $(allsrc:.c=.o)))
VPATH = $(sort $(dir $(allsrc)))
...
test: $(allobjs)

$(outdir)/%.o: %.c
        gcc -c -o $@ $<

当然,如果您在b.caaa都有bbb,这会遇到问题,但是因为您正试图将所有目标文件放入相同的目录,无论如何都有。摆脱$(notdir并在$(outdir)下保持相同的目录结构可能更有意义,在这种情况下,您不需要VPATH

outdir = release
allsrc = aaa/a.c bbb/b.c ccc/c.c
allobjs = $(addprefix $(outdir), $(allsrc:.c=.o))
...
test: $(allobjs)

$(outdir)/%.o: %.c
        mkdir -p `dirname $@`
        gcc -c -o $@ $<