RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 576801
Accepted
Maxim Gusev
Maxim Gusev
Asked:2020-10-12 16:28:21 +0000 UTC2020-10-12 16:28:21 +0000 UTC 2020-10-12 16:28:21 +0000 UTC

ccache和make有什么区别?

  • 772

我最近了解到ssache这样的程序。

摘自维基百科:

使用 ccache 可以极大地加快一些编译多次的包或项目的构建,因为只有自上次编译以来发生变化的文件才会被重新编译。

就这一点而言,ccache 比 make 有什么优势(或者还有其他优势)?

什么时候使用ccache?

makefile
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    aleksandr barakin
    2020-10-12T20:37:13Z2020-10-12T20:37:13Z

    简短回答:它们是完全不同的程序。比较它们毫无意义:它们不可互换。


    稍微长一点的答案:

    make与编译器完全无关,而ccache是C、C++、Objective-C 和 Objective-C++的编译器缓存。使用它的标准方法是“替代”编译器(例如,通过创建形式的符号链接/usr/local/bin/cc)。

    基本思想是检测何时再次编译完全相同的代码并重用之前生成的输出。(我的意译:基本思想是检测你第二次编译相同的代码,并使用已经完成的结果)。


    非常简单,没有细微差别和细节

    在编译过程中,一个所谓的。目标模块(目标文件)。例如,作为执行的结果,cc -c файл.c它将被接收файл.o

    链接器( linker )稍后可以使用它来创建带有程序的可执行文件。

    一个可执行文件通常由多个目标模块链接而成。如果我们“在额头上”( ) 自动化这个过程,那么每次调用这个长命令时,所有源文件cc -c файл1.c && cc -c файл2.c && cc файл1.o файл2.o -o программа都将被一次又一次地编译,即使我们只对其中一个文件进行了更改。

    为避免重新编译未更改的文件,您可以使用例如make程序,它实际上不会编译,但有助于避免在不需要的地方重新做。好吧,如果makefile中有适当的规则,它会描述文件之间的依赖关系以及如何更新那些需要更新的文件。

    此类规则的示例:

    • 如果файл.c较新файл.o,则运行命令cc -c файл.c
    • 如果файл.o较新программа,则运行命令cc файл.o -o программа

    如果我们有一个项目(并且目标文件在编译后不会被删除),所有这些都很好用。如果有多个项目,并且在所有项目中(或至少在某些项目中)使用файл.c相同的内容?make程序在这里无助于避免在不同项目中对同一文件进行多次编译。

    这里提到的ccache程序可以帮助我们(如果我们用它“替换”该程序cc)。

    算法很简单:

    1. 如果传入的文件还没有被编译,则通过调用“real”编译它,cc并将结果(目标模块)复制到缓存中。
    2. 如果传输的文件已经编译过,则从缓存中复制完成的目标模块。

    检测是通过散列不同类型的信息来完成的,这些信息对于编译应该是唯一的,然后使用散列和来识别缓存的输出。(我的意译:为了确定一个文件“相同”,使用了各种信息的散列,这对于给定的编译必须是唯一的,并且这些散列和允许您计算应该使用哪些缓存结果).

    • 1
  2. МАН69К
    2020-10-12T17:13:36Z2020-10-12T17:13:36Z

    ccache仅在您引用的行为中具有优势。make每次构建包时,它都会再次编译。ccache, 不像make, 编译前先看 - 也许这项工作已经完成了?如果某个文件已经编译过,则不会重新编译,而是采用先前编译的结果。当然ccache,它很聪明地跟踪到文件虽然之前编译过,但是现在里面有变化,因此需要重新编译。

    在什么情况下应用?

    在那些您经常需要重新编译相同程序并且希望加快此过程的情况下。例如ccache,它在 Gentoo 发行版中非常有用,其中程序的安装仅包括从源代码编译它们。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5