ARM64(aarch64)环境下使用Bazel编译Abseil失败问题求解
问题根因
报错是因为你使用的Jetson Xavier NX的ARMv8.2架构支持AES硬件加速指令,abseil的随机数模块检测到架构特性后尝试编译硬件加速实现,但Bazel默认没有为ARM64平台开启crypto扩展的编译参数,导致vaesmcq_u8、vaeseq_u8这些硬件加速指令相关的always_inline函数无法正常内联。CMake能正常编译是因为其内部自动检测了当前CPU的架构特性,自动添加了对应的编译参数。
可行解决方案
方案1:编译时指定架构编译参数(最方便,无需修改配置文件)
直接在bazel build命令后加--copt=-march=armv8.2-a+crypto即可,完整命令如下:
bazel build //example:hello_world --copt=-march=armv8.2-a+crypto
这个参数会告诉GCC当前目标架构支持ARMv8.2和crypto扩展,可正常编译硬件加速实现,性能最优。
方案2:强制禁用abseil的硬件加速随机数实现(无需考虑架构兼容性)
在WORKSPACE文件的http_archive引入abseil的配置中添加编译定义,关闭硬件加速:
修改你的WORKSPACE文件为如下内容:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "com_google_absl", urls = ["https://github.com/abseil/abseil-cpp/archive/98eb410c93ad059f9bba1bf43f5bb916fc92a5ea.zip"], strip_prefix = "abseil-cpp-98eb410c93ad059f9bba1bf43f5bb916fc92a5ea", patch_cmds = [ "echo \"ABSL_RANDOM_INTERNAL_FORCE_DISABLE_HW_AES=1\" >> absl/random/internal/platform_config.h", ], )
这个方案会强制abseil使用软件实现的随机数算法,兼容性更好,适合需要跨架构编译的场景。
方案3:全局配置Bazel的ARM64编译参数(适合长期在该设备开发的场景)
在项目根目录创建.bazelrc文件,添加如下内容:
build:aarch64 --copt=-march=armv8.2-a+crypto build --config=aarch64
之后每次执行bazel build无需额外加参数,自动生效。
内容的提问来源于stack exchange,提问作者Martin Kubovčík
相关产品推荐
相关产品推荐

