c++ ccache使用方法 c++如何用ccache缓存编译结果

大晨吖_4838

大晨吖_4838

2026-03-21

435人浏览

原创

ccache 是编译器前端缓存代理,通过哈希源码、头文件、宏定义及编译选项实现缓存复用;中大型 c++ 项目局部构建可提速 2–5 倍,推荐用 cmake_cxx_compiler_launcher=ccache 启用,注意避开 -fprofile-generate 等不兼容选项。

c++ ccache使用方法 c++如何用ccache缓存编译结果

ccache 是什么,为什么值得在 C++ 项目里立刻启用

ccache 不是编译器,而是编译器前端缓存代理——它把 g++ 或 clang++ 的输入(源码、头文件、宏定义、编译选项)哈希后查缓存;命中就直接返回目标文件,跳过实际编译。对中大型 C++ 项目,首次全量编译后,局部修改再构建常能快 2–5 倍。

关键点:它只缓存成功编译的结果,不缓存错误;且默认对 -g、-O2、-DFOO=bar 等所有影响输出的参数敏感,所以不用手动管理“缓存键”。

怎么让 cmake 项目自动走 ccache(最常用场景)

cmake 本身不调用 ccache,但可以通过设置编译器路径或环境变量触发。推荐用 CMAKE_CXX_COMPILER_LAUNCHER,它比改 CXX 环境变量更可靠,尤其在交叉编译或多配置生成器(如 Ninja + VS)下不会漏掉。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 命令行启用:cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ..
  • 如果用的是 Ninja,确保 ccache 在 $PATH 中且可执行(运行 ccache --version 验证)
  • 避免同时设 CXX=ccache g++ 和 CMAKE_CXX_COMPILER_LAUNCHER,后者会覆盖前者,容易误以为没生效
  • 检查是否真在用 ccache:编译时加 --trace 或看 ccache -s 输出的 cache hit rate,不是看有没有报错

哪些编译选项会让 ccache 失效或降级为直通

ccache 对某些选项天然不兼容,遇到就会绕过缓存、直接调用真实编译器。这不是 bug,是设计使然——因为这些选项让输出不可预测或依赖运行时状态。

  • -fprofile-generate / -fprofile-use:涉及运行时采样数据,ccache 拒绝缓存
  • -MP(Makefile 依赖生成):ccache 不解析依赖输出,直接透传
  • -MD / -MMD:虽然支持,但要求所有头文件路径必须可被 ccache 完整捕获;若用了 -I/tmp/build/xxx 这类临时路径,且该路径在后续构建中不存在,缓存会失效
  • -g 本身没问题,但 -gline-tables-only 和 -gz(压缩调试段)在旧版 ccache(

缓存目录、大小和清理的实际控制方式

ccache 默认用 $HOME/.ccache,但大项目容易撑爆磁盘。别靠手动 rm -rf,要用内置机制。

  • 改缓存位置:export CCACHE_DIR=/fast/ssd/ccache(写进 shell profile 或 CI 脚本)
  • 限制大小(推荐):ccache --max-size=20G,超过时自动 LRU 清理;别设太小(如 1G),否则频繁抖动
  • 查看状态:ccache -s,重点关注 cache hit rate 和 files in cache;若 cache hit rate 长期低于 30%,大概率是编译选项不稳定或头文件路径含时间戳/随机值
  • 强制清空:ccache -C(慎用),日常用 ccache -c(清理过期项)更安全

一个容易被忽略的点:ccache 不感知 git 分支切换,但不同分支的头文件内容变了,哈希自然不同——所以不要指望“一次缓存永久受益”,它只对重复构建同一代码树有效。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

20

15

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

2026.10.10

20

15

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

2026.10.10

0

15

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

2026.10.10

20

26

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

2026.10.10

0

32

C++构造函数定义与调用方法
C++构造函数定义与调用方法

C++构造函数用于初始化类对象,是面向对象编程的重要基础。本专题从构造函数的定义、声明和调用入手,介绍默认构造函数、带参数构造函数、拷贝构造函数及成员初始化列表,帮助初学者掌握对象创建与初始化的基本方法。

2026.10.10

20

16

Kratos框架零基础入门教程
Kratos框架零基础入门教程

本专题整理Kratos框架入门内容,涵盖Go环境准备、kratos CLI安装升级、new命令创建项目、目录结构分层说明、服务启动与双协议端口、依赖下载报错排查,帮助开发者快速跑通第一个Kratos框架微服务应用。

2026.10.10

20

15

C++条件判断语句怎么写
C++条件判断语句怎么写

C++条件判断是控制程序执行流程的重要基础。本专题介绍if、if-else、else if和switch等常见分支语句,结合条件表达式、比较运算符与代码示例,帮助初学者掌握不同场景下的判断逻辑。

2026.10.10

0

13

C++变量怎么声明和赋值
C++变量怎么声明和赋值

C++变量是编写程序和存储数据的基础。本专题围绕变量声明、定义、初始化、赋值和类型选择等内容展开,帮助初学者理解不同变量的用法,并掌握在实际代码中定义和使用变量的方法。

2026.10.10

20

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习