Makefile 如何将目录前置到存储在'$^';变量

Makefile 如何将目录前置到存储在'$^';变量,makefile,Makefile,我试图使用ar命令从一些.o文件构建一个库,这些.o文件存储在如下变量中: OBJS := foo.o bar.o baz.o libfoo.a: $(OBJS) $(AR) rcs $(LIBDIR)/$@ $^ 我有一个构建库的规则,如下所示: OBJS := foo.o bar.o baz.o libfoo.a: $(OBJS) $(AR) rcs $(LIBDIR)/$@ $^ 但是,这不起作用,因为所有这些对象文件都存储在单独的bin目录中,因此ma

我试图使用
ar
命令从一些
.o
文件构建一个库,这些
.o
文件存储在如下变量中:

OBJS    := foo.o bar.o baz.o
libfoo.a: $(OBJS)
    $(AR) rcs $(LIBDIR)/$@ $^
我有一个构建库的规则,如下所示:

OBJS    := foo.o bar.o baz.o
libfoo.a: $(OBJS)
    $(AR) rcs $(LIBDIR)/$@ $^
但是,这不起作用,因为所有这些对象文件都存储在单独的bin目录中,因此make无法找到它们。这样的事情显然不起作用:

libfoo.a: $(OBJS)
    $(AR) rcs $(LIBDIR)/$@ $(BINDIR)/$^

那么,我如何告诉make在不需要cd的情况下在不同的目录中查找这些对象文件呢?

一种可能性是:在所有obj之前添加一个dir,然后覆盖
OBJS
,或者用新符号替换
OBJS

OBJS := foo.o bar.o baz.o
SUBDIR_OBJS := $(OBJS:%=subdir/%)

show:
    @echo OBJS $(OBJS)
    @echo SUBDIR_OBJS $(SUBDIR_OBJS)

有关替换的更多信息,请参见gnu

gnu文件名函数具有addprefix:
$(addprefix obj/,$(OBJS))
。做同样的事情,可能比普通模式替换更具可读性。请注意,此生成文件已损坏,因为它将在CWD中查找libfoo.a,并在$(LIBDIR)/libfoo.a中创建存档,从而导致libfoo.a始终过期(丢失)并重新生成。一个正确的makefile应该将$(LIBDIR)/libfoo.A作为目标,并在配方中使用$@。先决条件也是一样:不要在食谱中给它们加上路径前缀。@Andreas谢谢,这很有道理。