2015-04-23 7 views
3

Что имеется в виду по статистике ccache «для ссылки». Я думал, что ccache только завернул компилятор, а не компоновщик?Что означает ccache под названием «вызван для ссылки»

[[email protected] ~]$ 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 

ответ

3

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

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

2

Чтение release notes было не очень понятно мне как:

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

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

Теперь он работал:

  • Первая компиляция сделал промах кэша, и хранятся результаты (два файлов: манифест плюс .o)
  • Второй сделал кэш ударил
  • г ++ был вызван для ссылки в 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 

Надеется, что это помогает!