我有一个像这样的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个)
答案 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.c
和aaa
都有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 $@ $<