我最近了解到ssache这样的程序。
摘自维基百科:
使用 ccache 可以极大地加快一些编译多次的包或项目的构建,因为只有自上次编译以来发生变化的文件才会被重新编译。
就这一点而言,ccache 比 make 有什么优势(或者还有其他优势)?
什么时候使用ccache?
我最近了解到ssache这样的程序。
摘自维基百科:
使用 ccache 可以极大地加快一些编译多次的包或项目的构建,因为只有自上次编译以来发生变化的文件才会被重新编译。
就这一点而言,ccache 比 make 有什么优势(或者还有其他优势)?
什么时候使用ccache?
简短回答:它们是完全不同的程序。比较它们毫无意义:它们不可互换。
稍微长一点的答案:
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
)。算法很简单:
cc
并将结果(目标模块)复制到缓存中。检测是通过散列不同类型的信息来完成的,这些信息对于编译应该是唯一的,然后使用散列和来识别缓存的输出。(我的意译:为了确定一个文件“相同”,使用了各种信息的散列,这对于给定的编译必须是唯一的,并且这些散列和允许您计算应该使用哪些缓存结果).
ccache
仅在您引用的行为中具有优势。make
每次构建包时,它都会再次编译。ccache
, 不像make
, 编译前先看 - 也许这项工作已经完成了?如果某个文件已经编译过,则不会重新编译,而是采用先前编译的结果。当然ccache
,它很聪明地跟踪到文件虽然之前编译过,但是现在里面有变化,因此需要重新编译。在那些您经常需要重新编译相同程序并且希望加快此过程的情况下。例如
ccache
,它在 Gentoo 发行版中非常有用,其中程序的安装仅包括从源代码编译它们。