使用 ndk 25 > 使用 bazel 为 Android 构建 tflite c++ lib

问题描述 投票:0回答:1

我正在构建一个需要 ndk 版本高于 25 的大型项目(我现在使用的是 25.0.8775105)。我想在我的项目中使用 TFLite。按照文档,在我的 x86-64 机器上交叉编译它以适用于 arm64-v8a 架构,说明如下:

  1. 获取tensorflow源码
  2. 安装 bazel(我已经尝试过 6.0.0 和 7.0.0-prebuild)
  3. 运行
    ./configure
    并对
    y
    Would you like to interactively configure ./WORKSPACE for Android builds?
    ,然后配置它。
  4. 奔跑
    bazel build -c opt --config=android_arm64 //tensorflow/lite:libtensorflowlite.so
  5. 提取 .so 文件并获取头文件,然后像使用任何其他库一样使用。

当我运行

./configure
并同意配置
./WORKSPACE
时,它要我提供一个 ndk 目录。但是,当我提供它时(它在我的系统上是
/home/tb/Android/Sdk/ndk/25.0.8775105
,与推荐的非常相似)我遇到了这个:
WARNING: The NDK version in /home/tb/Android/Sdk/ndk/25.0.8775105 is 25, which is not supported by Bazel (officially supported versions: [19, 20, 21]). Please use another version. Compiling Android targets may result in confusing errors. 
然后是由此引起的错误:

Traceback (most recent call last):
  File "/home/tb/Desktop/tensorflow/tensorflow_src/./configure.py", line 1363, in <module>
    main()
  File "/home/tb/Desktop/tensorflow/tensorflow_src/./configure.py", line 1336, in main
    create_android_ndk_rule(environ_cp)
  File "/home/tb/Desktop/tensorflow/tensorflow_src/./configure.py", line 653, in create_android_ndk_rule
    get_ndk_api_level(environ_cp, android_ndk_home_path))
  File "/home/tb/Desktop/tensorflow/tensorflow_src/./configure.py", line 747, in get_ndk_api_level
    api_levels = sorted(os.listdir(platforms))
FileNotFoundError: [Errno 2] No such file or directory: '/home/tb/Android/Sdk/ndk/25.0.8775105/platforms'

我试过用

bazel build -c opt //tensorflow/lite:libtensorflowlite.so --fat_apk_cpu=arm64-v8a
编译它,它实际上构建了 .so 文件,但是当我尝试构建代码时它说
C/C++: ld: error: undefined symbol: tflite::impl::Interpreter::Invoke()
,我确实在 linux 上运行我的项目并且它工作正常,android 使用如果不是相同的 cmake 文件,则相似,所以我认为 .so 已损坏。

我该怎么办?有没有人有链接,最好是官方的,预建的 tflite aarch64 / arm64-v8a .so 文件用于 c++?

更新:我已经 opened an issue 详细说明了我迄今为止尝试过的一切。

android c++ tensorflow android-ndk bazel
1个回答
0
投票

为了在我的 NDK 25 项目上编译和使用,我下载了 NDK 20,在我运行

./configure
时将其作为路径,并在我配置
WORKSPACE
时使用 ndk 20 路径。它编译并使用来自我设法运行它的同一来源的包含文件。对于任何挣扎的人,您可能想切换到不同的分支。我在分支之间切换了一下,最终找到了一个可行的分支(主要是主分支或 vx.x 或 rx.x 分支。)。

© www.soinside.com 2019 - 2024. All rights reserved.