以下两个选项有什么区别?在这两种情况下,$<
只会扩展为只有一个requisite
(根据定义“第一个”)?
选项1:
libcounter.a(lexer.o): lexer.o
$(AR) $(ARFLAGS) $@ $<
libcounter.a(counter.o): counter.o
$(AR) $(ARFLAGS) $@ $<
选项2:
libcounter.a: lexer.o
$(AR) $(ARFLAGS) $@ $<
libcounter.a: counter.o
$(AR) $(ARFLAGS) $@ $<
ARFLAGS在两种情况下都持有rv
。
作为参考,示例来自书籍Managing Projects with GNU Make。
答案 0 :(得分:3)
在第一个选项中,make
知道足以查看libcounter.a
对象内的lexer.o
内部,以查看是否需要使用新对象更新库。在第二个选项中,将库本身的时间戳与对象进行比较,这可能导致错过库的更新 - 例如想象1)lexer.o
构建,然后2)counter.o
构建,然后3)libcounter.a
添加新的lexer.o
;现在,libcounter.a
上的时间戳比counter.o
更新,因此make
错误地断定它不需要将新的counter.o
添加到库中。