onnxruntime本机交叉编译 | 你好陌生人
Tell
Anything can I help you ?
Menu
The menu of my blog
log out
log out

onnxruntime本机交叉编译

天选之子版本

刚好碰到一个工程需要使用arm64的机子上面使用onnxruntime,但是那台机子没有基本的编译环境,于是就在本机amd64的对onnxruntime库进行交叉编译
拉取源码

1
git clone --branch v1.8.0 --recursive https://github.com/microsoft/onnxruntime.git

编译代码如下:

1
2
3
4
5
6
7
8
9
10
./build.sh \
--config Release \
--build \
--update \
--build_dir build_arm64 \
--skip_tests \
--parallel $(nproc) \
--build_shared_lib \
--cmake_extra_defines \
CMAKE_TOOLCHAIN_FILE=./cmake-arm64-toolchain.cmake

编译的时候可能会下的很慢可以挂个代理
其中cmake-arm64-toolchain.cmake 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# cmake-arm64-toolchain.cmake
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR aarch64)


set(ZLIB_ROOT /home/test/Desktop/yuesang/c++/3dpart/zlib)
set(CMAKE_INCLUDE_PATH ${ZLIB_ROOT}/include)
set(CMAKE_LIBRARY_PATH ${ZLIB_ROOT}/lib)
# 指定工具链前缀路径
set(TOOLCHAIN_ROOT /home/test/Desktop/yuesang/c++/3dpart/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu)

set(CMAKE_C_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-gnu-g++)

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

#这里我是缺少zlib才需要的如果没有可以不用加重点是设置TOOLCHAIN_ROOT就是你的编译器相关的,本地也可以下载arrch64相关的编译器,如果是本地的就这样

1
2
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

如果build成功那么恭喜你,如果没有成功接着往下看,我把我编译碰到的问题先都罗列出来

倒霉蛋一号

a79f3eec63052fdf15ce9570a4d5efe4.png
这是第一个错误缺少zlib库,你可以去下载一下zlib
然后编译一下

1
2
3
4
5
6
7
8
9
cd zlib-1.2.13
mkdir build-arm64 && cd build-arm64

cmake .. \
-DCMAKE_TOOLCHAIN_FILE=../toolchain-zlib.cmake \
-DCMAKE_INSTALL_PREFIX=/home/test/zlib-arm64

make -j$(nproc)
make install

toolchain-zlib.cmake跟上面那个差不多自己设置一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# toolchain-zlib.cmake
# 用于使用 sigmastar 交叉编译器编译 zlib 给 aarch64 (ARM64)

# 设置目标平台为 ARM64 Linux
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 设置交叉编译器路径
set(TOOLCHAIN_ROOT)

# 设置 C/C++ 编译器
set(CMAKE_C_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-gnu-g++)

# 禁用默认查找主机路径
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_ROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# 可选:生成静态库(如需 .a 文件)
set(BUILD_SHARED_LIBS OFF)

# 启用 Position Independent Code(为了方便后续链接进 ONNX Runtime)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

然后查看我天选之子版的说明

倒霉蛋二号

d6708e500ec87edfb62d8aa3cdd51644.png
这个错误一度把我搞到崩溃,本来想用docker的,但是docker的网络一致没弄好,然后配置docker的时候下了一个qemu-aarch64然后居然就能通过了,你说屌不屌
直接下载

1
sudo apt install qemu-user qemu-user-static

倒霉蛋三号

716531467da86fc1f8bdb3324dad8f8b.png
解决了上面那个问题又碰到了这个,因为我的gnu没有装在本机导致qume-arrch64找不到相关的依赖所以你还需要设置一下他的路径

1
export QEMU_LD_PREFIX=

这个是一次性的或者土办法,直接用ln -s软连接也可以

倒霉蛋四号

json库有异常
79e04aaffa98e173006e77603cc0343c.png

1
2
3
4
5
cd ./onnxruntime/cmake/external/json

git fetch
git checkout v3.9.1 # 或者使用 master 分支

然后cd到你onnxruntime路径下面

1
2
3
4
5
6
rm -rf .git/modules/cmake/external/json

# 删除实际子模块目录
rm -rf cmake/external/json


最后进入到cmake/external下面把json下在下来

1
git clone --branch v3.9.1 https://github.com/nlohmann/json.git cmake/external/json

至此编译解释,我在这里提一句,我写文章的意义是在于给自己看,写出来的途中顺便能帮到一些人,对于某些平台明明就是一个很简单的东西,但是非得要vip文章或者收费,十多莲花剩一朵。