没有什么是自动或内置的,你可以做。 make 只是不是很擅长注意这种事情。你可以做的最简单的事情就是“解决”这个问题就是保持一个 FORCE d 包含存档中表示的源文件列表的目标,包含该文件作为先决条件 libtest.a 并将文件的内容与存档的内容进行比较,并重建/添加/删除/等。适当地往/来自图书馆。
make
FORCE
libtest.a
libtest.lst: FORCE $(SRC_FILES:.c=.o) printf '%s\\n' $(filter-out $<,$^) > $@ libtest.a: libtest.lst $(SRC_FILES:.c=.o) ar t $@ > $@.contents if diff -q $@.contents libtest.lst; then \ ar ....; \ fi rm $@.contents
或者,如果你不关心避免重建忘记列表/差异/等。然后重新运行 ar 用于构建存档的命令。
ar
作为一项额外的改进,您可以将差异逻辑添加到 libtest.lst 相反的配方,以便它只更新 libtest.lst 文件,如果它改变(避免 make 认为它需要运行 libtest.a 当库内容没有改变时规则)。像这样的东西。
libtest.lst
libtest.lst: FORCE $(SRC_FILES:.c=.o) printf '%s\\n' $(filter-out $<,$^) | sort > $@.tmp cmp -s $@ $@.tmp || mv $@.tmp $@ rm -f $@.tmp libtest.a: libtest.lst $(SRC_FILES:.c=.o) ar -rcs $@ $(filter-out $<,$?)