解释如下:
Ccache 是一个编译器缓存。它通过缓存之前的编译并检测何时再次执行相同的编译来加快重新编译的速度。
我不明白。当我使用 Ninja 或 Makefile 之类的构建系统时,例如,当我修改源文件时,构建系统会记录哪些文件是哪些翻译单元的依赖项,并根据这些信息避免重新编译这些翻译单元,据我所知,我将其描述为缓存。另外,我注意到,当我修改一个翻译单元时,它不仅避免了将所有翻译单元重新编译成目标文件,而且不知何故(我不知道具体是怎么做到的)避免了将所有内容重新链接到可执行文件中。因此,在一个非常大的项目中,我可以修改翻译单元中的代码,重新编译,然后整个项目就可以在我的快速多核计算机上在 2 秒内再次执行了。
请问 ccache 在此基础上做了什么,用实际的具体例子解释一下,比如“它缓存了代码的 x、y、z 部分”。
据我所知,ccache 能够记住并识别同一编译单元的多个版本,而普通 make 只能通过时间戳识别一个版本。
例如,您做一个小的修改(例如,更改调用的格式
std::cout
)并编译:到这里为止,一切看起来都一样。
然后你测试了一下,决定撤销更改并重新编译。
正常的 make 仅忽略自上次编译以来没有更改的文件。
make
很老旧。它不懂规则的作用,只是遵循规则创建“目标”。结果就是,它无法真正进行缓存。它需要相当多的帮助才能弄清楚文件之间的依赖关系,而且完全不理解编译器的设置。因此,除非你有多个构建目录(你需要手动管理),否则它只会.o
为每个文件保留一个文件。.c
ccache
因为它是一个具有更明确任务的工具,所以它能够更好地理解它的功能。它可以.o
为一个文件保存多个文件.c
,具体取决于编译器设置和预处理器定义。通过
ccache
处理缓存,您可以告诉make
通过跳过其原始缓存.PHONY
。make
然后将始终要求ccache
“重建”.o
,但这通常只是一个快速查找。