HarmonyOS鸿蒙Next中编译构建onnxrumtime共享库,但运行失败

HarmonyOS鸿蒙Next中编译构建onnxrumtime共享库,但运行失败

  • tpc_c_cplusplus-fix_other/lycium 中,运行 ./build.sh onnxruntime

配置信息:tpc_c_cplusplus-fix_other/thirdparty/onnxruntime/HKPBUILD

build() {
    cd $builddir/$ARCH-build

    ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@"
    -DOHOS_ARCH=$ARCH -DCMAKE_ASM_FLAGS="-Wno-unused-command-line-argument" \
        -DCMAKE_C_FLAGS="-Wno-unused-command-line-argument" \
        -DCMAKE_CXX_FLAGS="-Wno-unused-command-line-argument -Wno-shorten-64-to-32" \
        -Donnxruntime_ENABLE_CPU_FP16_OPS=OFF -DCPUINFO_BUILD_PKG_CONFIG=OFF -DBUILD_TESTING=OFF -DBUILD_GMOCK=OFF -Dprotobuf_USE_EXTERNAL_GTEST=OFF \
        -Donnxruntime_ENABLE_CPUINFO=OFF -Donnxruntime_BUILD_UNIT_TESTS=OFF -Donnxruntime_CROSS_COMPILING=ON -Donnxruntime_BUILD_SHARED_LIB=ON ../cmake/ -L > `pwd`/build.log 2>&1
    # 编译
    make VERBOSE=1 >> `pwd`/build.log 2>&1   
    ret=$?
    cd $OLDPWD
    return $ret
}
  • 测试代码
#include <iostream>
#include <vector>
#include <onnxruntime_cxx_api.h>

ctc_vad_callback eventCallbackFunc;

void validateONNXRuntime() {
    try {
        // 创建 ONNX Runtime 环境
        Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "ONNXRuntimeTest");

        // 创建会话选项
        Ort::SessionOptions session_options;
        session_options.SetIntraOpNumThreads(1);
        session_options.SetInterOpNumThreads(1);
        
        // 用于验证库是否加载成功的简单测试
        std::cout << "ONNX Runtime 版本:" << OrtGetApiBase()->GetVersionString() << std::endl;
        
        // 创建一个示例张量
        std::vector<int64_t> input_shape = {1, 3};
        std::vector<float> input_tensor_values = {1.0f, 2.0f, 3.0f};
        
        Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(
            OrtAllocatorType::OrtArenaAllocator, 
            OrtMemType::OrtMemTypeDefault
        );
        
        Ort::Value input_tensor = Ort::Value::CreateTensor<
            float>(
            memory_info, 
            input_tensor_values.data(), 
            input_tensor_values.size(), 
            input_shape.data(), 
            input_shape.size()
        );
        
        std::cout << "ONNX Runtime 库验证成功!" << std::endl;
    }
    catch (const Ort::Exception& e) {
        std::cerr << "ONNX Runtime 验证失败:" << e.what() << std::endl;
    }
}

注:include 文件在 tpc_c_cplusplus-fix_other/thirdparty/onnxruntime/onnxruntime-1.18.2/include/onnxruntime/core/session

  • onnxruntime_c_api.h
  • onnxruntime_cxx_api.h
  • onnxruntime_cxx_inline.h
  • onnxruntime_float16.h

以上测试代码在 macOS 环境,使用 macOS 的 onnxruntime 共享库运行正常,但在鸿蒙测试手机中,运行 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "ONNXRuntimeTest") 便会提示空指针。 大家有在鸿蒙环境下正常使用 onnxruntime 共享库的吗?求助。


更多关于HarmonyOS鸿蒙Next中编译构建onnxrumtime共享库,但运行失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

如何编译onnxruntime这个库啊,能指点下吗?

更多关于HarmonyOS鸿蒙Next中编译构建onnxrumtime共享库,但运行失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


楼主方便提供下具体的报错日志吗?

在HarmonyOS鸿蒙Next中编译构建ONNX Runtime共享库时,运行失败可能涉及以下几个原因:

  1. 依赖库缺失或不兼容:ONNX Runtime依赖于多个第三方库,如Protobuf、Eigen等,这些库在鸿蒙系统中的版本可能与ONNX Runtime的要求不匹配。

  2. 编译器或工具链问题:鸿蒙Next使用的编译器和工具链可能与ONNX Runtime的构建配置不兼容,导致生成的共享库无法正常运行。

  3. 系统API差异:鸿蒙系统的API与Linux、Android等系统存在差异,ONNX Runtime中可能使用了鸿蒙系统不支持的系统调用或API。

  4. 权限问题:鸿蒙系统对应用的权限管理较为严格,共享库的加载和执行可能需要特定的权限,未正确配置可能导致运行失败。

  5. 内存管理问题:鸿蒙系统的内存管理机制与其他系统不同,ONNX Runtime中可能存在内存分配或释放不当的代码,导致运行时崩溃。

  6. 符号冲突:在鸿蒙系统中,可能存在与ONNX Runtime中定义的符号冲突,导致链接或运行时错误。

解决方法包括检查依赖库版本、调整编译器和工具链配置、修改系统调用或API使用、配置正确的权限、优化内存管理代码以及避免符号冲突。

在HarmonyOS鸿蒙Next中编译构建ONNX Runtime共享库时,若运行失败,可能原因包括:

  1. 依赖缺失:确保所有依赖库已正确安装,且版本兼容。
  2. 环境配置:检查环境变量是否配置正确,如LD_LIBRARY_PATH
  3. 编译器选项:确认编译选项(如-fPIC)已启用,以适应共享库构建。
  4. 权限问题:确保运行时具有足够的权限访问库文件。
  5. 版本冲突:检查是否存在与鸿蒙系统或其他库的版本冲突。

建议逐一排查上述问题,并根据错误日志调整配置。

回到顶部