Я хочу использовать кэш для ускорения компиляции.
Я столкнулся, Как я включаю кэш?.
Это - то, что я сделал до сих пор:
$ sudo apt-get install -y ccache
$ dpkg -l ccache
ii ccache 3.1.6-1 Compiler cache for fast recompilation of C/C++ code
$ whereis ccache
ccache: /usr/bin/ccache /usr/lib/ccache /usr/bin/X11/ccache /usr/share/man/man1/ccache.1.gz
Я добавил ccache
к пути путем добавления его к моему ~/.bashrc
файл:
$ export PATH="/usr/lib/ccache:$PATH"
$ source ~/.bashrc
$ echo $PATH
/usr/lib/ccache:/usr/local/cuda-5.5/bin/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Символьные ссылки выглядят хорошо:
$ ll /usr/lib/ccache/
total 76
drwxr-xr-x 2 root root 4096 mai 22 10:48 ./
drwxr-xr-x 253 root root 69632 mai 22 10:48 ../
lrwxrwxrwx 1 root root 16 mai 22 10:48 avr-g++ -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 avr-gcc -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 avr-gcc-4.5.3 -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 c++ -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 c89-gcc -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 c99-gcc -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 cc -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 g++ -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 g++-4.6 -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 gcc -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 gcc-4.6 -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 x86_64-linux-gnu-g++ -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 x86_64-linux-gnu-g++-4.6 -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 x86_64-linux-gnu-gcc -> ../../bin/ccache*
lrwxrwxrwx 1 root root 16 mai 22 10:48 x86_64-linux-gnu-gcc-4.6 -> ../../bin/ccache*
Ссылка выглядит хорошей:
$ which g++
/usr/lib/ccache/g++
$ make
g++ -o affine_euler affine_euler.cpp -O3 -DEIGEN_NO_DEBUG -I/usr/include/eigen3
g++ -o test_eigen test_eigen.cpp -O3 -DEIGEN_NO_DEBUG -I/usr/include/eigen3
Но кэш пуст:
$ ccache -s
cache directory /home/dell/.ccache
cache hit (direct) 0
cache hit (preprocessed) 0
cache miss 0
files in cache 0
cache size 0 Kbytes
max cache size 1.0 Gbytes
Где я неправильно?
# Install package
sudo apt install -y ccache
# Update symlinks
sudo /usr/sbin/update-ccache-symlinks
# Prepend ccache into the PATH
echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc
# Source bashrc to test the new PATH
source ~/.bashrc && echo $PATH
Ваш путь (по крайней мере, начало) должен быть похожим:
/usr/lib/ccache:/usr/local/cuda-5.5/bin/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
И g++
/ gcc
должен теперь указать на:
which g++ gcc
/usr/lib/ccache/g++
/usr/lib/ccache/gcc
, Если Вы не хотите предела количеству файлов и размеру кэша:
ccache -F 0
ccache -M 0
Выставочная статистика кэша:
ccache -s
Освобождают кэш и сбрасывают статистику:
ccache -C -z
Каждый раз Вы звоните gcc
или g++
; ccache
назван. Моя ошибка состояла в том, что я не удалил уже скомпилированные файлы. Просто удалите весь Ваш CMake
/ выходные файлы и настраивайте/компилируйте снова.
Ваш ccache
не должно быть пустым тогда. Теперь попробуйте make clean
и make
, и Вы будете видеть, что это намного быстрее, чем перекомпиляция всего благодаря кэшу.
Ваш $PATH
не выглядит корректным; ccache
каталог должен быть там. Просто выполненный:
export PATH="/usr/lib/ccache/:$PATH"
... и попытка Ваш g++
команды снова. Этот каталог полон команд прокси тот вызов ccache
. Это должно работать с большинством сценариев.
, Если Вы просто звоните g++
вручную (не как вышеупомянутый, где Вы используете, делают), можно просто предварительно ожидать команду:
ccache g++ ...
Относительно установки:
Я нашел, что на Ubuntu 18.04 (Бионический Бобр) поставленное значение по умолчанию не ловит вызовы cc
и c++
. Чтобы полностью установить кэш там Вам нужно:
sudo apt install ccache
sudo /usr/sbin/update-ccache-symlinks
export PATH="/usr/lib/ccache/:$PATH"
И затем (из-за обновленных символьных ссылок) также звонит в cc
и c++
будьте пойманы!