ccache统计"为链接调用"是什么意思。我以为ccache只包装了编译器,而不是链接器?
[Brian@localhost ~]$ ccache -s
cache directory /home/Brian/.ccache
cache hit (direct) 19813
cache hit (preprocessed) 67
cache miss 11
called for link 498
called for preprocessing 10
unsupported source language 472
no input file 12
files in cache 258568
cache size 33.8 Gbytes
max cache size 100.0 Gbytes
ccache
确实不支持链接。
然而,它确实取代了C编译器(更具体地说是C编译器驱动程序)(看看它在哪里以及如何安装和使用)。因此,它需要"传递"它接收到的任何命令,而不将自己处理/修改到工具链的各个部分。
阅读发行说明对我来说也不太清楚:
当与单个对象文件链接。
但这意味着您正在进行编译&链接在一个操作中,因此ccache无法透明地提供结果。
使用一个基本的hello.c程序进行演示。首先让我们清除一切:
$ ccache -Czs
Cleared cache
Statistics cleared
cache directory /home/jdg/.ccache
cache hit (direct) 0
cache hit (preprocessed) 0
cache miss 0
files in cache 0
一步完成编译和链接(两次,只是为了确定):
$ ccache g++ hello.c
$ ccache g++ hello.c
$ ccache -s
cache hit (direct) 0
cache hit (preprocessed) 0
cache miss 0
called for link 2
files in cache 0
没有缓存任何内容,因为ccache无法
分两个单独的步骤(也分两次)进行:
$ ccache g++ -c hello.c ; g++ hello.o
$ ccache g++ -c hello.c ; g++ hello.o
$ ccache -s
cache hit (direct) 1
cache hit (preprocessed) 0
cache miss 1
called for link 4
no input file 2
files in cache 2
现在它工作了:
- 第一次编译导致缓存未命中,并存储了结果(两个文件:manifest plus.o)
- 第二个缓存命中
- g++总共为链接调用了4次,其中2次没有源,但只有.o
而调用了预处理的东西?很简单,您只需要使用编译器来扩展所有包含/定义的内容(例如,在查找依赖项时)
$ g++ -E hello.c
$ g++ -M hello.c
$ ccache -s
cache hit (direct) 1
cache hit (preprocessed) 0
cache miss 1
called for link 4
called for preprocessing 2
unsupported compiler option 1
no input file 2
files in cache 2
希望这能有所帮助!