1

下面的两个选项有什么区别?在这两种情况下都不会$<扩展到只有一个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) $@ $<

ARFLAGSrv在这两种情况下都成立。

作为参考,这些示例取自《使用 GNU Make 管理项目》一书。

4

1 回答 1

3

在第一个选项中,make知道足够了解对象内部libcounter.alexer.o查看它是否需要使用新对象更新库。在第二个选项中,将库本身的时间戳与对象进行比较,这可能会导致库的更新丢失——例如,假设 1)lexer.o构建,然后 2)counter.o构建,然后 3)libcounter.alexer.o添加;现在在这一点上,时间戳libcounter.a比 更新counter.o,因此make错误地断定它不需要将新的添加counter.o到库中。

于 2012-10-05T20:16:30.523 回答