天选之子版本
刚好碰到一个工程需要使用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成功那么恭喜你,如果没有成功接着往下看,我把我编译碰到的问题先都罗列出来
倒霉蛋一号

这是第一个错误缺少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)
|
然后查看我天选之子版的说明
倒霉蛋二号

这个错误一度把我搞到崩溃,本来想用docker的,但是docker的网络一致没弄好,然后配置docker的时候下了一个qemu-aarch64然后居然就能通过了,你说屌不屌
直接下载
1
| sudo apt install qemu-user qemu-user-static
|
倒霉蛋三号

解决了上面那个问题又碰到了这个,因为我的gnu没有装在本机导致qume-arrch64找不到相关的依赖所以你还需要设置一下他的路径
这个是一次性的或者土办法,直接用ln -s软连接也可以
倒霉蛋四号
json库有异常

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文章或者收费,十多莲花剩一朵。