首页 > 解决方案 > 当我使用带有“libtensorflowlite.so”文件的 ndk-build 进行编译时,我遇到了一些错误

问题描述

我是 TFLite 的初学者。我想为多设备(如 android、linux 等)编译基于 c++ 的代码。因此,我使用 libtensorflow.a 文件在 local-linux 和 RPI 中运行我的代码并成功运行此代码。我使用用于 RPI 和 ubuntu 的 tensorflow procject 使用 make 文件制作了一个静态库文件。( ./tensorflow/tensorflow/lite/tools/make/build_*.sh 文件),我在这些设备中运行我的可执行代码。(我编译使用 g++ 和 arm-linux-gnueabihf-g++ )

而且,我尝试为 android 构建。但是,我在为 Android 构建时遇到了一些错误。首先,我想在 ADB shell 中执行代码,目标是“arm64-v8a”。所以,我使用 bazel for android 构建了共享库(libtensorflowlite.so 文件)。并且,我检查了在我的智能中运行的“benchmark_model”代码电话。(此代码是使用 tensorflow 项目中的 bazel 构建的)并且,我使用 ndk-build 构建了我的代码。但我遇到了一些错误,即“./obj/local/arm64-v8a/libtensorflowlite.so: undefined reference to `__register_atfork@LIBC'" 我在构建过程中哪里出错了?...我的代码在下面。

安卓.mk:


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)   
    LOCAL_MODULE := tensorflowlite
    LOCAL_SRC_FILES := lib/android_64/libtensorflowlite.so
    include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)   
    LOCAL_CFLAGS += --std=c++11 -fPIC -funsafe-math-optimizations -ftree-vectorize -pie -lstdc++ -lpthread  -lrt -I$(LOCAL_PATH)/include    
    LOCAL_MODULE := MyCode
    LOCAL_SRC_FILES := main.cc
    LOCAL_SHARED_LIBRARIES += tensorflowlite    
    include $(BUILD_EXECUTABLE)

应用程序.mk:

    APP_STL := c++_static

主要代码:这是非常简单的代码。(只是对我的项目进行一些预处理,并使用 tflite 运行解释器)

include path : tensorflow的头文件和flatbuffer的头文件

使用 ndk-build 构建时遇到错误:

$~/:$ ndk-build APP_ABI=arm64-v8a 

Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16
[arm64-v8a] Compile++      : MyCode <= main.cc
[arm64-v8a] Prebuilt       : libtensorflowlite.so <= jni/lib/android_64/
[arm64-v8a] Executable     : MyCode
./obj/local/arm64-v8a/libtensorflowlite.so: undefined reference to `__register_atfork@LIBC'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

当我在本地 PC 的 ubuntu 中使用“file”和“readelf”命令检查“libtensorflowlite.so”文件时。

$~/: file lib/android_64/libtensorflowlite.so
libtensorflowlite.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, stripped

$~/: readelf --dynamic lib/android_64/libtensorflowlite.so
Dynamic section at offset 0x2202b8 contains 32 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libm.so]
 0x0000000000000001 (NEEDED)             Shared library: [liblog.so]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so]
 0x000000000000000e (SONAME)             Library soname: [libtensorflowlite.so]
 0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN/:$ORIGIN/..]
 0x0000000000000019 (INIT_ARRAY)         0x22cb60
 0x000000000000001b (INIT_ARRAYSZ)       536 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x22cd78
 0x000000000000001c (FINI_ARRAYSZ)       16 (bytes)
...

我需要你的帮助。谢谢。

标签: tensorflowtensorflow-litendk-build

解决方案


谢谢阅读。我解决了这个错误。这只是 android 的版本不匹配。tflite.so 文件是从 ANDROID-26 编译的。但是,当我的代码被编译时,编译器的目标是 ANDROID-18。因为,我没有针对 Application.mk 文件中的设置。因此,“NDK-build”选项默认设置为 ANDROID-18。所以,我的可执行代码和so文件不匹配。


推荐阅读