使用Bazel交叉编译libjpeg_turbo适配ARM遇编译错误求助
解决libjpeg_turbo交叉编译ARM架构时的-march参数错误
问题根源
从报错信息能看出,你正在用x86架构的gcc编译ARM/aarch64平台的汇编代码jsimd_neon.S,但给编译器传了-march=armv7-a这个ARM专属参数——x86版本的gcc根本不识别ARM架构的编译选项,直接触发参数错误。
解决方案
针对你的BUILD.libjpeg_turbo文件,按以下步骤修改:
1. 条件化设置ARM专属编译参数
找到编译ARM SIMD代码的cc_library规则,用Bazel的select语法,只在目标架构为ARM时添加ARM专属编译参数,避免x86编译器执行这些参数:
cc_library( name = "libjpegturbo_simd_armv7a", srcs = glob(["simd/arm/*.S"]), copts = select({ "@platforms//cpu:arm": [ "-D__ARM_NEON__", "-march=armv7-a", "-fprefetch-loop-arrays", ], "//conditions:default": [], }), # 保留原有的其他配置(如includes、linkopts等) ... )
2. 指定ARM交叉编译工具链
确保编译时使用ARM版本的gcc:
- 如果是Android设备,直接用项目自带的Android NDK工具链,编译时添加参数:
bazel build --config=android_arm - 如果是Linux ARM设备,先安装交叉编译工具链(比如Ubuntu下执行
sudo apt install gcc-arm-linux-gnueabihf),然后在Bazel配置中指定工具链路径,或者通过--cpu=arm --crosstool_top=@bazel_tools//tools/cpp:toolchain参数强制使用ARM工具链。
3. 区分aarch64和armv7架构
如果你的3D相机是aarch64(ARM64)架构,需要单独处理simd/arm/aarch64下的代码:
cc_library( name = "libjpegturbo_simd_aarch64", srcs = glob(["simd/arm/aarch64/*.S"]), copts = select({ "@platforms//cpu:aarch64": [ "-D__ARM_NEON__", "-march=armv8-a", ], "//conditions:default": [], }), ... )
内容的提问来源于stack exchange,提问作者Cash Lo
相关产品推荐
相关产品推荐

