You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CCACHE缓存异常:Synopsis ARC多核编译startup.s文件结果错误

双核ARC应用ccache缓存汇编文件导致逻辑异常的解决方案

问题背景

使用Synopsys ARC编译器开发双核应用,通过-DCORE_C0和-DCORE_C1宏区分startup.s的核心运行逻辑,CMake会生成两个不同路径的目标文件:

  • /build/bin/DEBUG/AppCore0/CMakeFiles/startup.s.o
  • /build/bin/DEBUG/AppCore1/CMakeFiles/startup.s.o

禁用ccache时,两个目标文件编译命令带不同宏,生成的文件内容不同,程序运行正常;启用ccache后,尽管编译命令宏参数不同,但生成的目标文件完全一致,导致程序无法正常运行。此前尝试set_property(SOURCE startup.s PROPERTY LANGUAGE ASM)未解决问题。

可行解决方案

1. 让ccache忽略所有汇编文件

通过ccache的配置跳过.s后缀文件的缓存:

  • 临时生效:在构建前设置环境变量
    # Windows命令提示符
    set CCACHE_IGNORE_EXT=s
    # PowerShell
    $env:CCACHE_IGNORE_EXT = "s"
    
  • 永久生效:修改ccache配置文件(Windows下为%LOCALAPPDATA%\ccache\ccache.conf,Linux/macOS为~/.ccache/ccache.conf),添加:
    ignore_ext = s
    
    配置后ccache会直接调用原编译器处理.s文件,不进行缓存。

2. 强制ccache严格区分编译参数

ccache默认可能忽略部分路径或参数差异,设置CCACHE_NOHASHDIR让其将所有命令行参数和输出路径纳入缓存键计算:

# Windows命令提示符
set CCACHE_NOHASHDIR=1
# PowerShell
$env:CCACHE_NOHASHDIR = "1"

该配置会让ccache更精准地区分不同宏定义的编译任务,避免缓存混淆。

3. 在CMake中单独为startup.s禁用ccache

针对单个文件绕过ccache,直接使用原编译器:

# 取消startup.s的ccache编译启动器
set_property(SOURCE startup.s PROPERTY RULE_LAUNCH_COMPILE "")
# 确保文件被识别为汇编语言
set_property(SOURCE startup.s PROPERTY LANGUAGE ASM)

此方法仅对startup.s生效,不影响其他文件的ccache缓存。

4. 调试ccache缓存命中情况

使用ccache的 verbose 模式查看缓存键计算逻辑,确认是否正确识别宏参数差异:

ccache --verbose C:\arc\bin\ccac.exe -DCORE_C0 -ID:\git\sdk\hal\device\hb_common -ID:\git\sdk\lib\common\src\cjson -arcv2em -Werror=return-type -O -o /build/bin/DEBUG/AppCore0/CMakeFiles/startup.s.o -c D:\git\sdk\hal\startup.s

同时用ccache -s查看缓存统计,确认是否出现不应该的缓存命中。

内容的提问来源于stack exchange,提问作者Vazeeruddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:43:11