Compilation 如果我保留二进制文件,删除对象文件安全吗?

Compilation 如果我保留二进制文件,删除对象文件安全吗?,compilation,gnu-make,binaryfiles,scons,Compilation,Gnu Make,Binaryfiles,Scons,在使用GNU Make(或SCons)编译(C/C++)代码并成功创建二进制文件后,是否有理由保留.o对象文件 我是否可以始终安全地删除它们,或者在某些情况下它们被二进制文件引用?一旦通过链接对象文件创建了可执行文件(以及 对象文件所依赖的库)到目前为止都是废物 你的可执行文件很重要。您可以安全地删除它们 但是,如果使用GNU Make之类的构建系统构建可执行文件 或者,让构建系统删除 成功生成的对象文件 这种构建系统的主要目的是重建可执行文件, 当需要重建时,以最小的重建量 必要的。如果可执行

在使用GNU Make(或SCons)编译(C/C++)代码并成功创建二进制文件后,是否有理由保留
.o
对象文件


我是否可以始终安全地删除它们,或者在某些情况下它们被二进制文件引用?

一旦通过链接对象文件创建了可执行文件(以及 对象文件所依赖的库)到目前为止都是废物 你的可执行文件很重要。您可以安全地删除它们

但是,如果使用GNU Make之类的构建系统构建可执行文件 或者,让构建系统删除 成功生成的对象文件

这种构建系统的主要目的是重建可执行文件, 当需要重建时,以最小的重建量 必要的。如果可执行文件
prog
需要对象文件
a.o
b.o
c.o
来 被链接后,您只更改源文件
c.c
,然后更改生成系统 只需重新编译
c.c
然后用新的
c.o
加上旧的
a.o
b.o
重新链接
prog

但只有在旧的
a.o
b.o
仍然存在的情况下,它才能带来这种经济。 如果您在上次成功构建时删除了它们,则必须执行
prog
虽然新的
a.o
b.o
将是相同的,但将从头开始重建 和以前一样:浪费时间

当然,有时您需要从头开始重建,并且 为此,必须首先删除所有对象文件。为了支持这一点 GNU中的需求使您为您的项目提供, 传统上称为
clean
,它除了删除目标文件之外什么也不做 以及建造过程中的任何其他中间副产品。您可以通过以下方式明确地调用它:

make clean
在SCON中,您不需要在构建项目中为 清理中间产品。您只需运行
scons-c
scons--clean
。 但是,在任何一种情况下,您都不希望删除成功应用程序的对象文件
默认情况下生成,因为这违背了生成系统的目的。

所以保留它们的唯一原因是为了节省编译时间,以防将来需要重新生成,对吗?在我的场景中,我希望通过删除从源代码处编译/安装的大型软件包的对象文件来释放磁盘空间,因此,如果我可以节省一些GB;-),这是有意义的。顺便说一句,我注意到scons-c(我猜也是makeclean)也会删除实际的二进制文件。例如,您可以同时拥有“clean”、“cleanobjs”和“cleandist”规则,它们各自执行不同的操作,一个删除二进制文件,另一个不删除。缺点是,如果使用编码不正确的“干净”规则,您可能会留下想要删除的内容,并且很难注意到。