ccache是什麼
ccache -- “compiler cache”的縮寫,是一個gcc/g++的c語言編譯器緩存。
ccache能做什麼
簡單來説,ccache將基於單條gcc編譯命令級別顆粒,將本次編譯命令的產物,複製進行壓縮一份到緩存目錄中,下次編譯的時候, <font color='red'>如果檢測到相同編譯命令,並且沒有修改輸入的源文件(當前c/cpp或依賴的頭文件) </font>,則直接讀取緩存目錄中上次編譯流程,省去編譯時間,從而優化編譯時長。
對項目工程而言,一次代碼修改僅會改變極少量的源文件,使用ccache只會重新編譯修改部分的代碼相關的源文件,而未進行修改的源文件則可以直接使用緩存優化了編譯時長。
ccache的效率如何
-
小試牛刀
使用ccache編譯一個簡單的cpp- 原始編譯
time g++ hello.cpp -o hello.o
- 首次通過ccache 進行編譯
time ccache g++ hello.cpp -o hello.o
- 原始編譯
- 二次通過ccache 進行編譯
`time ccache g++ hello.cpp -o hello.o`

| 編譯方式 | 編譯時長 |
|---|---|
| 原始構建 | 0.24s |
| 使用ccache首次構建 | 0.30s |
| 使用ccache二次構建 | 0.02s |
使用ccache首次編譯時長 > 原始編譯時長 >> 使用ccache二次編譯時長
原因是使用ccache會對編譯命令做緩存處理需要花費一些耗時。
(具體原因放在之後再更新)
-
實際工程表現
以使用虛擬機1U2G規格編譯redis-6.0.16:
原始直接make:
make clean後使用ccache首次編譯:
make clean後使用ccache二次編譯:
| 編譯方式 | 編譯時長 |
|---|---|
| 原始構建 | 35s |
| 使用ccache首次構建 | 43s |
| 使用ccache二次構建 | 2.8s |
可以看到,對於重複編譯,無論是單命令編譯,還是實際工程編譯,使用ccache構建速度都壓縮了十倍,極大的提升了編譯效率!
ccache 如何使用
## 安裝ccche
-
apt直接安裝
# 安裝ccache apt install ccache # 查看ccache版本 ccache -V - 源碼安裝
目前ccache遵循GPL-3.0在github上開源,並且處於開源軟件的成長期,迭代較快,apt源並不能實時同步最新版本,可通過源碼編譯安裝的方式,獲取最新版本。
github: https://github.com/ccache/ccache
ccache的使用方式
-
ccache 拉起編譯命令
ccache g++ -c hello.cpp -o hello.o -
ccache偽裝成編譯器
# 找到ccache的安裝路徑 which ccache # 安裝實際路徑為: /usr/bin/ccache # 創建軟連接,將ccache偽裝成g++編譯器 ln -s /usr/bin/ccache g++ # 使用偽裝後的g++ 進行編譯 ./g++ -c hello.cpp -o hello.o可是問題來了
在實際工程當中,可能是由Makefile或者CMake進行管理編譯,不可能手動修改所有的編譯命令,我們應該將ccache使用上呢?
最為常用的方式是:
無論是在Makefile還是Cmake都可以通過聲明環境變量的方式來使用ccache
# 在構建腳本中增加
export CC="ccache gcc"
export CXX="ccache g++"
# 再進行編譯make/cmake
make
# cmake:
cmake -B output && cmake --build output
- make
對於Makefile工程,我們常會通過會在Makefile中,通過CC/CXX指定編譯器,因此在編譯前通過配置緩存變量CC/CXX來指定要是用編譯器即可。
-
cmake
Cmake隱式使用CC和CXX兩個緩存變量,通過export 配置CC/CXX一樣能使ccache生效。
ccache使用情況
如上在使用ccache跑一個CMake工程的時候,我們如果不注意標準輸出內容,就比較難判斷本次編譯是否使用了ccache。
有沒有一種更好的方式來幫助我們判斷當前工程有沒有使用ccache呢?
ccache提供了查詢緩存命中能力
執行ccache -s -v
可以詳細的看到
- 緩存存放目錄
Cache directory - 緩存配置文件路徑
Primary config - 最近一次使用緩存的時間
Status updated -
緩存總體命中的情況
- Hits表示命中緩存
- Misses表示未命中緩存,但是生成了緩存,下次可以命中
- 緩存目錄使用大小
Cache size
注意:
ccache 會通過LRU自動清理較長未訪問的緩存文件,使得緩存總大小小於Cache size。不要手動清理Cache directory目錄,造成緩存丟失。
如果默認緩存目錄會影響到你的正常使用磁盤,可通過 在/etc/profile 增加ccache配置緩存目錄的環境變量,改變緩存目錄並使其一直生效。
# 將ccache的緩存目錄設置為了/usr1/zhou/ccache
vim /etc/profile
# 追加環境變量
export CCACHE_DIR=/usr1/zhou/ccache
# 讓環境變量生效
source /etc/profile
小結
如果你只是想簡單瞭解並使用ccache, 通過上述的介紹,已經可以滿足日常使用ccache幫助自己的工程更快的進行編譯。
如果還想對ccache有更深的瞭解,在後續內容中會介紹ccache 其他好用的配置項功能以及ccache的源碼實現。
歡迎大家一起交流呀
qq羣:3638803451
vx:wxid_sgdelhiwombj12