m0_50822060 2025-12-31 14:21 采纳率: 0%
浏览 1

如何交叉编译onnxruntime

请问怎么在Linux x86的机器上交叉编Linux armv7上用的onnxruntime的动态库?

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2025-12-31 14:22
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    要在Linux x86机器上交叉编译适用于 Linux armv7 架构的 ONNX Runtime 动态库(.so 文件),你需要使用 交叉编译工具链 和 ONNX Runtime 的构建系统。以下是一个详细的步骤指南,包括关键点和代码示例。


    ✅ 一、准备工作

    1. 安装依赖项

    确保你已经安装了以下依赖项:

    sudo apt-get update
    sudo apt-get install -y build-essential cmake git libssl-dev libprotobuf-dev protobuf-compiler
    

    2. 下载 ONNX Runtime 源码

    从 GitHub 上克隆 ONNX Runtime 仓库:

    git clone https://github.com/microsoft/onnxruntime.git
    cd onnxruntime
    

    3. 获取 ARMv7 交叉编译工具链

    你可以使用 arm-linux-gnueabihf-gcc 工具链,通常在 Ubuntu 系统中可以通过如下命令安装:

    sudo apt-get install -y g++-arm-linux-gnueabihf
    

    或者,如果你需要更完整的工具链,可以下载 Linaro GCC


    ✅ 二、配置交叉编译环境

    1. 设置环境变量

    设置目标架构为 armv7,并指定交叉编译器路径:

    export TARGET_ARCH=armv7
    export CROSS_COMPILE=arm-linux-gnueabihf-
    export CC=${CROSS_COMPILE}gcc
    export CXX=${CROSS_COMPILE}g++
    export AR=${CROSS_COMPILE}ar
    export RANLIB=${CROSS_COMPILE}ranlib
    

    注意: 如果你使用的是 Linaro 工具链,可能需要将 CROSS_COMPILE 替换为实际路径,例如 /opt/linaro/gcc-arm-linux-gnueabihf-4.9.4/bin/arm-linux-gnueabihf-


    ✅ 三、构建 ONNX Runtime

    1. 创建构建目录

    mkdir build_armv7
    cd build_armv7
    

    2. 配置构建

    使用 CMake 进行配置,并指定目标平台:

    cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/platforms/LinuxARM.cmake \
          -DBUILD_SHARED_LIBS=ON \
          -DONNXRUNTIME_BUILD_SHARED_LIB=ON \
          -DUSE_CUDA=OFF \
          -DENABLE_CXX_TESTS=OFF \
          -DENABLE_PYTHON=OFF \
          -DENABLE_JAVA=OFF \
          ..
    

    重点说明:

    • -DCMAKE_TOOLCHAIN_FILE 是 ONNX Runtime 提供的用于交叉编译的工具链文件。
    • -DBUILD_SHARED_LIBS=ON 表示构建动态库(.so)。
    • -DONNXRUNTIME_BUILD_SHARED_LIB=ON 同样是为了生成共享库。

    3. 编译

    make -j$(nproc)
    

    注意: 根据你的 CPU 核心数,可以调整 -j 参数以加快编译速度。


    ✅ 四、获取编译结果

    编译完成后,动态库会生成在 build_armv7 目录下,具体路径如下:

    build_armv7/libonnxruntime.so
    

    此外,还有一些其他依赖库,如:

    build_armv7/libonnxruntime_providers_shared.so
    

    ✅ 五、验证是否成功

    你可以使用 file 命令验证生成的 .so 文件是否是 ARMv7 架构:

    file build_armv7/libonnxruntime.so
    

    输出应类似如下内容:

    build_armv7/libonnxruntime.so: ELF 32-bit LSB shared object, ARM, EABI5, version 1 (SYSV), dynamically linked, not stripped
    

    ✅ 六、完整步骤总结(有序列表)

    1. 安装依赖项

      • build-essential, cmake, git, libssl-dev, libprotobuf-dev, protobuf-compiler
    2. 获取 ONNX Runtime 源码

      • 使用 git clone 获取源码
    3. 安装 ARMv7 交叉编译工具链

      • 安装 g++-arm-linux-gnueabihf 或使用 Linaro 工具链
    4. 设置环境变量

      • 设置 TARGET_ARCH, CROSS_COMPILE, CC, CXX, AR, RANLIB
    5. 创建构建目录并配置 CMake

      • 使用 cmake 指定工具链文件和构建选项
    6. 执行编译

      • 使用 make 编译 ONNX Runtime
    7. 获取动态库

      • 查看 build_armv7 目录下的 .so 文件
    8. 验证编译结果

      • 使用 file 命令确认目标架构是否正确

    ✅ 七、注意事项

    • 如果你还需要支持 CUDA 或其他硬件加速,需调整 CMake 配置并安装对应的 SDK。
    • 交叉编译过程中可能会遇到一些依赖问题,建议查看 ONNX Runtime 的官方文档或 GitHub Issues。
    • 如果你打算部署到嵌入式设备(如 Raspberry Pi),请确保目标设备的内核版本与编译时一致。

    ✅ 八、修改后的 CMake 示例(可选)

    如果你要自定义 CMake 配置,可以参考如下脚本:

    #!/bin/bash
    
    # 设置环境变量
    export TARGET_ARCH=armv7
    export CROSS_COMPILE=arm-linux-gnueabihf-
    export CC=${CROSS_COMPILE}gcc
    export CXX=${CROSS_COMPILE}g++
    export AR=${CROSS_COMPILE}ar
    export RANLIB=${CROSS_COMPILE}ranlib
    
    # 创建构建目录
    mkdir -p build_armv7
    cd build_armv7
    
    # 配置 CMake
    cmake -DCMAKE_TOOLCHAIN_FILE=../tools/cmake/platforms/LinuxARM.cmake \
          -DBUILD_SHARED_LIBS=ON \
          -DONNXRUNTIME_BUILD_SHARED_LIB=ON \
          -DUSE_CUDA=OFF \
          -DENABLE_CXX_TESTS=OFF \
          -DENABLE_PYTHON=OFF \
          -DENABLE_JAVA=OFF \
          ..
    
    # 编译
    make -j$(nproc)
    

    如果你还有其他问题,比如如何在 ARM 设备上运行该库,或者如何集成到你的项目中,请继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 12月31日