【问题标题】:Is it safe to remove the object files if I keep the binary?如果我保留二进制文件,删除目标文件是否安全?
【发布时间】:2017-03-11 08:42:57
【问题描述】:

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

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

【问题讨论】:

    标签: compilation gnu-make binaryfiles scons


    【解决方案1】:

    一旦您通过链接目标文件(和 他们所依赖的库)目标文件是废物到目前为止 您的可执行文件受到关注。您可以安全地删除它们。

    但是,如果您使用 GNU Make 等构建系统构建可执行文件 或 Scons 肯定不建议让构建系统删除 成功构建的目标文件。

    这种构建系统的主要目的是重新构建您的可执行文件, 当它需要重建时,最小的重建量是 必要的。如果可执行文件prog 需要目标文件a.ob.oc.o 被链接,你只改变源文件c.c,然后是构建系统 会知道它可以重建prog 只需重新编译c.c 然后将prog 与新的c.o 加上旧的a.ob.o 重新链接。

    但只有在旧的a.ob.o 仍然存在的情况下,它才能实现这种经济。 如果您在上次成功构建时删除了它们,那么prog 必须 从头开始重建,尽管新的 a.ob.o 将是相同的 和旧人一样:浪费时间。

    当然,有时您想要从头开始重建,并且 为此,您必须首先删除所有目标文件。为了支持这一点 在 GNU 中需要让你为你的项目提供一个phony target, 通常称为clean,除了删除目标文件之外什么都不做 以及构建的任何其他中间副产品。您可以通过以下方式显式调用它:

    make clean
    

    在 Scons 中,您无需在构建项目中编写任何额外内容即可 清理中间产品。你只需运行scons -cscons --clean。 但无论哪种情况,您都不想删除成功的目标文件 默认构建,因为这违背了构建系统的目的。

    【讨论】:

    • 所以保留它们的唯一原因是节省编译时间,以防将来需要重新构建,对吧?在我的场景中,我想通过删除我从源代码编译/安装的大包的目标文件来释放磁盘空间,所以如果我可以节省几 GB ;-) 是有意义的。
    • 顺便说一句,我观察到 scons -c (我猜也是 make clean)也会删除实际的二进制文件。
    • 使用 gnu make,"make clean" 只会在你的 makefile 中运行 "clean:" 规则,所以它可以做任何你想做的事情。例如,您可以同时拥有“clean”、“cleanobjs”和“cleandist”规则,它们各自做不同的事情,一个删除二进制文件,另一个不删除。缺点是如果使用不正确编码的“干净”规则,您可能会留下想要删除的内容,并且很难注意到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2014-01-25
    • 2013-02-04
    • 2021-01-13
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多