我想知道在以正确的方式构建库之后如何强制make删除.o文件。
all: libtest.a
libtest.a: foo.o bar.o
ar r $@ $?
%.o : %.c
gcc -o $@ -c $<
将.o文件标记为.INTERMEDIATE
的问题是,即使一个源文件发生更改,所有.o文件也会被重新编译,即使它们已存在于存档中。有没有办法实现这一目标。删除目标文件,不重新编译未更改的源文件以更新库。
答案 0 :(得分:0)
是否会将ar
行更改为ar r $@ $? && rm *.o
(或类似作品?
答案 1 :(得分:0)
如果foo.c
已更改,则libtest.a
已过期,因此必须重建foo.o
,然后libtest.a
。但bar.o
也是libtest.a
的先决条件,因此在libtest.a
出现之前,Make无法执行bar.o
规则,因此它也会重建bar.o
。
最好的解决方案(我知道)是将库视为一组独立目标:
.PHONY: all
all: libtest.a(foo.o bar.o)
libtest.a(%.o): %.o
ar r libtest.a $^
(Make可以通过这种方式处理存档成员,但即使它不能,我们仍然可以将这种方法用于一些虚假的目标。)