使用 `$<` 制定规则,仅将一个对象添加到存档库

Make rule using `$<` only adding one object to archive library

我觉得很蠢,但我自己找不到解决办法:

我有一个 Makefile 可以从 C 源代码正确构建对象,我想将 $(OBJECTS) 放在存档库中。 我正在使用 GNU Make 4.0.

x.a: $(OBJECTS)
        echo "$< ($(OBJECTS))"
        $(AR) $(ARFLAGS) $@ $<

(原始行用 TAB 缩进。回显仅用于调试目的,$(AR) $(ARFLAGS) $@ $< 复制自 make 的内部规则)

进行输出(在对象构建完成后):

echo "log_thread/log_thread.o (log_thread/log_thread.o log_thread/thread.o)"
log_thread/log_thread.o (log_thread/log_thread.o log_thread/thread.o)
ar rv x.a log_thread/log_thread.o
ar: creating x.a
a - log_thread/log_thread.o

所以我希望两个对象模块都添加到库 x.a,但是 $< 只包含一个对象模块,而不是 $(OBJECTS))。

我的Make知识可能有点生疏,也许这就是我不明白的原因。 当然,两个目标模块都存在,并且输出是在删除 x.a 之后创建的(原始文件有点复杂)。

我不确定困惑在哪里: 根据定义,$< 自动变量仅包含第一个先决条件。 见 GNU make manual.

要获得比目标更新的所有先决条件,$? 是正确的自动变量。 所以正确的规则可能是:

x.a: $(OBJECTS)
        echo "$? ($(OBJECTS))"
        $(AR) $(ARFLAGS) $@ $?