GNU Make:将库成员存档并替换

时间:2012-10-05 19:55:36

标签: makefile gnu-make

以下两个选项有什么区别?在这两种情况下,$<只会扩展为只有一个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

1 个答案:

答案 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添加到库中。