编译Cobalt ARM64版本时cpu_features_get.cc出现HWCAP未定义错误
解决Cobalt 22 ARM64编译时
HWCAP_SET_FOR_ARMV8未定义的错误 问题背景
编译Cobalt 22版本的ARM64目标(基于WPE BRCM ARM端口),环境为Ubuntu 20.04,使用stbgcc-6.3.18交叉编译器并配置Sysroot,构建src/starboard/shared/linux/cpu_features_get.cc时出现系列HWCAP宏未定义错误,例如:
cpu_features_get.cc:381:12: error: 'HWCAP_SET_FOR_ARMV8' was not declared in this scope
原因分析
- 宏定义范围限制:文件中
HWCAP_SET_FOR_ARMV8等宏仅在满足SB_IS(32_BIT) || defined(ANDROID)条件时才会被定义,而ARM64 Linux环境下这两个条件均不成立,导致宏未声明。 - 代码编译逻辑矛盾:使用这些宏的代码块被包裹在
SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)条件下,ARM64时该条件为真,代码会被编译,但宏未定义,触发编译错误。 - 额外说明:这段调用宏的代码注释明确是针对32位ARM二进制运行在64位ARM64内核的场景,ARM64原生编译时实际不会进入该分支,但编译器仍会检查宏的定义。
解决方案
提供两种可行修改方案,按需选择:
方案1:扩展宏定义的适用范围
修改宏定义的条件,让ARM64环境也能定义所需的HWCAP宏:
- 打开
src/starboard/shared/linux/cpu_features_get.cc - 找到第53行的条件判断:
#if SB_IS(32_BIT) || defined(ANDROID) - 修改为:
#if (SB_IS(32_BIT) || defined(ANDROID)) || SB_IS(ARCH_ARM64) - 保存文件后重新执行编译流程。
方案2:限制代码分支的触发场景
调整代码逻辑,让ARM64环境下不会编译到依赖未定义宏的分支:
- 打开
src/starboard/shared/linux/cpu_features_get.cc - 找到
ConstructHwcapFromCPUInfo函数中的判断语句:if (hwcap_type == AT_HWCAP && architecture_generation >= 8) { - 修改为:
if (hwcap_type == AT_HWCAP && architecture_generation >= 8 && SB_IS(32_BIT)) { - 保存文件后重新执行编译流程。
验证
修改完成后,重新运行Cobalt的编译脚本,原有的HWCAP宏未定义错误应该会消失,编译可正常进行。
内容的提问来源于stack exchange,提问作者dscrdia
相关产品推荐
相关产品推荐

