2015-10-20 798 views
0

我想知道如何强制make以正确的方式构建库后删除.o文件。如何删除makefile中的中间目标文件

all: libtest.a 

libtest.a: foo.o bar.o 
    ar r [email protected] $? 

%.o : %.c 
    gcc -o [email protected] -c $< 

与.o文件标记为.INTERMEDIATE的问题是,所有的.o文件被重新编译,即使有一个源文件的更改,即使它们已经存在于档案。有没有办法做到这一点。删除目标文件并不重新编译未更改的源文件以更新库。

+0

据我所知,如果你删除所有的.o的编译后库中,即使只有一个源文件发生更改,也需要再次创建它们才能再次编译库。 – dietbacon

+0

但更新库时不需要未更改的对象文件。假设.o文件没有被删除,只有foo.c发生了变化。然后,可以使用简单的“ar libtest.a foo.o”更新库。 bar.o甚至不需要。但是,如果bar.o丢失,它会重新编译它。 – user1353535

+0

他们是需要的,但是因为他们根本没有改变,所以你不必再创建它们,只需要改变它们。它是这样的:检查哪些更改,重新创建.o为所有.o's并创建库 – dietbacon

回答

0

如果foo.c已经改变,那么libtest.a是过时的,所以要必须重建foo.o然后libtest.a,但bar.olibtest.a的先决条件太多,所以请直到bar.o存在不能执行libtest.a规则,所以它重建bar.o以及

最好的解决方案(我知道)是把图书馆作为一套独立的目标:

.PHONY: all 
all: libtest.a(foo.o bar.o) 

libtest.a(%.o): %.o 
    ar r libtest.a $^ 

(使能处理归档成员这种方式,但即使不能,我们仍然可以用一些伪目标这种做法。)

+0

此方法对于并行构建是否安全? – user1353535

+0

@ user1353535:我想这取决于'ar'是否是线程安全的;所以我不知道。 – Beta

0

会改变ar线ar r [email protected] $? && rm *.o(或类似的东西的工作?

+0

这不会有帮助,因为所有的.o文件在下一次即使是单个源文件更改时也必须重建。 – user1353535