前言

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信息。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐