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),添加:
配置后ccache会直接调用原编译器处理ignore_ext = s.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
相关产品推荐
相关产品推荐

