三方库onnxruntime交叉编译OHOS armeabi-v7a版本纪要
前言
TV大屏32位版本ai应用依赖libonnxruntime.so,运行报错,分析hilog日志,报错原因为定位该so中的OrtGetApiBase函数失败。
该so为应用sherpa_onnx模块中从github上拉取的1.16.3的ohos 32位闭源so(库上仅提供了该版本so),所以处理方案定为通过onnxruntime开源项目重新编译so。
编译过程记录
一、编译方式
使用的三方库交叉编译工具lycium,分支为fix_other:https://gitee.com/zhong-luping/tpc_c_cplusplus/tree/fix_other/lycium
选择该分支的原因是与lycium工具同级目录thirdparty中有onnxruntime的HPKBUILD配置,不用你再去关注该库的cmake编译参数。该工具可以通过配置版本号在编译时自动下载对应的三方库版本。
当然也可以自行写cmake命令编译单独拉源码编译。
源码版本地址:https://github.com/microsoft/onnxruntime/tree/v1.17.1
二、配置编译工具链
使用的本地现有工程编译出的sdk,也可以从日构建拉取sdk。
配置sdk路径
export OHOS_SDK=/home/sunchanglong/workspace/hardmony_sig_5.0.3/prebuilts/ohos-sdk/linux/15
配置cmake等工具路径
export PATH=/home/sunchanglong/workspace/hardmony_sig_5.0.3/prebuilts/ohos-sdk/linux/15/native/build-tools/cmake/bin:$PATH
配置32位gcc工具路径
export PATH=/home/sunchanglong/workspace/hardmony_sig_5.0.3/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin:/home/sunchanglong/workspace/hardmony_sig_5.0.3/prebuilts/build-tools/linux-x86/bin:$PATH
该工具会自动根据OHOS_SDK自动配置CMAKE_TOOLCHAIN_FILE,无需自行配置。
如果通过cmake命令编译则需要配置CMAKE_TOOLCHAIN_FILE指向ohos.toolchain.cmake,例如:
-DCMAKE_TOOLCHAIN_FILE=/home/sunchanglong/workspace/hardmony_sig_5.0.3/prebuilts/ohos-sdk/linux/15/native/build/cmake/ohos.toolchain.cmake
三、执行编译
onnxruntime对应的编译配置所在工具目录:thirdparty/onnxruntime/HPKBUILD
HPKBUILD文件修改项:
1、设置32位编译架构:archs=("armeabi-v7a")
2、版本设置:pkgver=v1.17.1 以及source="https://github.com/microsoft/onnxruntime/archive/refs/tags/v1.17.1.tar.gz"
3、如果已执行过编译,可以将下列参数该为false:
autounpack=false //是否自动解压压缩包
downloadpackage=false //是否下载项目压缩包
patchflag=false //是否需要打patch
4、cmake修改项
因armeabi-v7a架构NEON 指令集存在软浮点ABI兼容性问题,需要在CMAKE_C_FLAGS中添加-mfpu=neon -mfloat-abi=softfp,例如:
-DCMAKE_C_FLAGS="-Wno-unused-command-line-argument -mfpu=neon -mfloat-abi=softfp"
其他修改项:
1、mlas组件cmake修改
为mlas添加neon兼容处理,thirdparty/onnxruntime/onnxruntime-1.17.1/cmake/onnxruntime_mlas.cmake中,
set(ONNXRUNTIME_MLAS_LIBS onnxruntime_mlas)下方添加:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfloat-abi=softfp -mfpu=neon")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfloat-abi=softfp -mfpu=neon")
2、python需要3.8版本及以上
检查python --version,确认指向3.8及以上版本。
3、dns修改
因onnxruntime还依赖其他github上的组件,编译时会自动下载,但是蓝区电脑访问github相当缓慢,极容易导致拉取超时(在build.log日志中会有体现),所以对电脑dns进行修改,在C:\Windows\System32\drivers\etc\hosts中添加:
140.82.113.3 github.com
140.82.114.20 gist.github.com
185.199.108.153 assets-cdn.github.com
185.199.109.153 assets-cdn.github.com
185.199.110.153 assets-cdn.github.com
185.199.111.153 assets-cdn.github.com
然后cmd中执行ipconfig /flushdns使修改生效,会改善不少,但还是会有较低概率拉取失败。
lycium工具编译命令:
cd lycium
./build.sh onnxruntime(thirdparty目录下的三方项目名)
编译onnxruntime的工程目录
thirdparty/onnxruntime/onnxruntime-1.17.1
编译生成的构建目录
thirdparty/onnxruntime/onnxruntime-1.17.1/armeabi-v7a-build
编译日志build.log也在该目录下。
最终编译执行成功将生成libonnxruntime.so.1.17.1库,该库的SONAME元数据也叫libonnxruntime.so.1.17.1,如果需要去掉文件名的版本号后缀,则需要同时修改so中的SONAME元数据,否则运行时会提示找不到libonnxruntime.so.1.17.1。
注意:该工具编译过程完成可能是假象,不代表已经编译出最终目标,如果检查最终目标so缺失,需要检查build.log日志,关注日志中的error信息。
更多推荐
所有评论(0)