拓冰建站拓冰建站
首页 / 资讯中心 / 正文

sccache 安装与配置完整指南:三步跑起来,让重复编译直接命中缓存

sccache 安装与配置完整指南三步跑起来让重复编译直接命中缓存【免费下载链接】sccacheSccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in remote storage environments, including various cloud storage options, or alternatively, in local storage.项目地址: https://gitcode.com/GitHub_Trending/sc/sccache编译一个大项目动辄十几分钟改一行代码也得干等。sccache 就是来解决这个的——它是一个跨平台的编译器缓存工具把编译结果存起来下次同样输入直接命中缓存、跳过重复编译。这篇 sccache 安装与配置指南带你三步跑起来再接进 CMake 和 Cargo最后聊聊怎么调优和排错。它到底怎么让编译变快的核心就一句话同样输入直接还你上次的答案。sccache 作为编译器的包装层挡在 gcc / clang / MSVC / rustc 前面。每次编译请求进来它先拼一个缓存键——由预处理后的源码、编译器版本、相关编译参数、被 include 的头文件内容一起算出来的哈希。拿这个键去查缓存命中直接把上次存好的产物还给你编译器压根没启动这一步最省时。未命中放行给真实编译器把结果连同这个键存进缓存下回同样的请求就走上面的命中分支了。用一张图串一下sccache 缓存命中流程先建立三个直觉它默认用本地磁盘当缓存装完即用不需要额外服务。跑起来是一个本地常驻小服务客户端-服务器模型首次编译会顺手把它拉起来空闲约 10 分钟自动退出。缓存键里带了编译器版本和参数所以换工具链、换-O2/-O3这类关键参数都会另起炉灶不会拿错缓存。想更深入看内部结构读 Architecture.md本地磁盘模式细节在 Local.md。3 分钟上手最省事的装法 一条验证命令先别追求最优先让它跑起来。挑一条对你最省事的Linux / 通用有 Rust 工具链# 拉预编译二进制最快需先装 cargo-binstall cargo binstall sccache # 或者从源码编译较慢 cargo install sccache --lockedmacOSbrew install sccache一句话搞定。Windowswinget install Mozilla.sccache或scoop install sccache。装完两秒验证sccache --version # 能打印版本号说明已在 PATH 里且可用 sccache --show-stats # 看缓存统计刚装会是一堆 0正常能打印版本 统计就算成功了。缓存目录它会自动选一个合理位置Linux 是~/.cache/sccache你什么都不配也能用。各平台怎么装按优先级选别贪全不用把每种方法都记牢。每个平台记住首选和一个备选就够了。平台首选推荐备选一句话说明macOSbrew install sccachesudo port install sccacheHomebrew 最省心Windowswinget install Mozilla.sccachescoop install sccache系统自带 winget首选它Linuxcargo binstall sccache发行版包管理器 /cargo install sccache --locked有 Rust 工具链就走 cargo通用 / 容器nix shell nixpkgs#sccache仓库自带 flake见 flake.nix可复现环境CI 友好再补两种手动兜底知道有这条路就行预编译二进制从官方发布页下载对应平台的压缩包解压后把sccache放进PATH。适合不方便用包管理器的机器。源码编译需要 Rust 工具链README 要求 Rust 1.91.0。git clone https://gitcode.com/GitHub_Trending/sc/sccache cd sccache cargo build --release # 想要更小的二进制可加 --no-default-features --featuress3,redis一句话取舍日常开发用包管理器要特定后端特性或想跟最新代码再上源码编译。接入你的构建系统Rust 和 C/C 两条路装好只是第一步得让编译器走 sccache 才生效。Cargo 加速给 Rust 挂上 sccacheCargo 认rustc-wrapper把它指向 sccache 即可。两种写法环境变量最快适合临时 / CIexport RUSTC_WRAPPERsccache cargo build --release配置文件持久推荐长期项目——写在$HOME/.cargo/config.toml全局或项目根.cargo/config.toml[build] rustc-wrapper sccache接完之后cargo clean cargo build跑两次第二次基本全是命中提速最直观。两个容易踩的坑先知道bin/dylib/cdylib/proc-macro这类会调系统链接器的 crate 不能缓存。debug 默认开启增量编译而增量编译的结果不能被缓存——想要命中记得在 profile 里关掉incremental。更多细节见 Rust.md。CMake 接入 sccache 的正确姿势CMake 3.4 原生支持编译器启动器configure 时带上两个参数即可cmake -DCMAKE_C_COMPILER_LAUNCHERsccache \ -DCMAKE_CXX_COMPILER_LAUNCHERsccache \ -B build不想改命令行就在CMakeLists.txt里自动探测find_program(SCCACHE sccache) if(SCCACHE) set(CMAKE_C_COMPILER_LAUNCHER ${SCCACHE}) set(CMAKE_CXX_COMPILER_LAUNCHER ${SCCACHE}) endif()MSVC 单独提一句用 MSVC 时要保证调试信息用嵌入格式。CMake 3.25 用CMAKE_MSVC_DEBUG_INFORMATION_FORMAT配合CMP0141 NEW老版本就把/Zi换成/Z7。这块坑比较多但只影响 Windows MSVC 的组合。Makefile 接入 sccacheCC 前缀一下Makefile 最朴素让CC/CXX指向 sccache 前缀即可CC sccache gcc CXX sccache g或者更省事在 shell 里export CCsccache gcc CXXsccache g再makeMakefile 一个字不用改。进阶与调优先调这几个日常用得到的高频开关优先级从高到低1缓存大小和位置——最常调的两个export SCCACHE_DIR/path/to/cache # 缓存放哪 export SCCACHE_CACHE_SIZE20G # 默认 10G大项目调大2CI / 多机共享上分布式后端。本地磁盘只服务单机想团队或 CI 共享把后端指向远端存储本地磁盘自然变成 L0 加速层。# S3 兼容AWS S3 / R2 等 export SCCACHE_BUCKETmy-bucket export SCCACHE_REGIONus-east-1 export SCCACHE_ENDPOINTs3.us-east-1.amazonaws.com # Redis export SCCACHE_REDIS_ENDPOINTredis://127.0.0.1:6379还支持 GCS、Azure、Memcached、WebDAV、阿里云 OSS、腾讯云 COS字段说明在各自文档里如 S3.md、Redis.md、Memcached.md。3CI 用只读模式CI 只想蹭已有缓存、不想写新东西时export SCCACHE_LOCAL_RW_MODEREAD_ONLY注意对空缓存开只读等于白开只会增加开销。4压缩远端传输时 sccache 会自动用 zstd 压缩一般不用管想再压小点或更快可调export SCCACHE_CACHE_ZSTD_LEVEL10 # 1~22默认 3越大越小但越慢5路径归一化共享缓存的关键sccache 默认要求绝对路径一致才命中。不同 checkout 目录 / 不同用户 / CI 路径不一致时命中率会掉。设SCCACHE_BASEDIRS在算键前把前缀剥掉export SCCACHE_BASEDIRS/home/user/project6多级缓存本地 Redis S3 串成层次结构、自动回填export SCCACHE_MULTILEVEL_CHAINdisk,redis,s3详见 MultiLevel.md。想系统过一遍所有环境变量和配置文件写法看 Configuration.md。常见问题排查现象 → 原因 → 解法命中率上不去通常是这几类。对号入座缓存命中率为 0 怎么办现象sccache --show-stats里 cache hits 长期为 0。常见原因换了目录 / 用户 / CI checkout 路径不同绝对路径变了。→ 设SCCACHE_BASEDIRS归一化。编译器版本或关键参数-O*、-g等不一致。→ 确认工具链稳定。Rust开了增量编译或编的是bin/dylib/proc-macrocrate。→ 关incremental把大bin拆成lib 薄bin包装。解法先用SCCACHE_LOGdebug SCCACHE_ERROR_LOG/tmp/sccache.log跑一次看它到底为什么 bypass。改了代码缓存却没失效现象逻辑改了产物却像没变。原因缓存里混进了坏产物或某些外部因素如__TIME__没被正确纳入缓存键。解法设SCCACHE_RECACHE强制重建缓存必要时sccache --zero-stats清零统计重新观察。缓存越攒越大怎么瘦身现象磁盘吃紧。解法调小SCCACHE_CACHE_SIZE用sccache --zero-stats清零统计必要时换更小的SCCACHE_DIR或清理旧缓存。编译报错怎么确认是不是 sccache 的锅现象构建失败怀疑是缓存层问题。解法临时export SCCACHE_IGNORE_SERVER_IO_ERROR1让它连不上服务时静默降级到本地编译器对比一次再配合日志定位。排查三板斧记住先看统计--show-stats→ 再开日志SCCACHE_ERROR_LOGSCCACHE_LOGdebug→ 最后动缓存SCCACHE_RECACHE。【免费下载链接】sccacheSccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in remote storage environments, including various cloud storage options, or alternatively, in local storage.项目地址: https://gitcode.com/GitHub_Trending/sc/sccache创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门