Что означает ccache под вызовом ссылки

Что подразумевается под статистикой 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

person Brian J Murray    schedule 23.04.2015    source источник


Ответы (2)


ccache действительно не поддерживает связывание.

Однако он заменяет компилятор C (точнее, драйвер компилятора C) (посмотрите, где и как он установлен и используется). Из-за этого ему необходимо «пропускать» любые команды, которые он получает, и не обрабатывать/модифицировать себя в соответствующих частях цепочки инструментов.

person mfro    schedule 23.04.2015

Чтение примечаний к выпуску тоже не очень ясно для меня:

Счетчик статистики «требуется ссылка» теперь корректно обновляется при связывании с одним объектным файлом.

Но это означает, что вы выполняете компиляцию и компоновку в одной операции, поэтому 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 плюс .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

Надеюсь это поможет !

person JeanDo    schedule 04.03.2017
comment
Вы намеренно запустили g++ без ccache в части Выполнение этого в два отдельных шага? - person Michael Kopp; 22.08.2019