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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:33:27