Android项目CMake构建TFLite时Python头文件找不到的问题
在Android项目中使用CMake构建TensorFlow Lite(TFLite),该方法已在同项目的Debian Linux版本上成功运行。按照官方文档编译arm64版本时,Android Studio构建/运行后出现如下错误:
In file included from /home/user/Desktop/official_stuff/tensorflow_src/tensorflow/lite/python/interpreter_wrapper/numpy.cc:17:
In file included from /home/user/Desktop/official_stuff/tensorflow_src/tensorflow/lite/python/interpreter_wrapper/numpy.h:49:
In file included from /usr/include/python3.9/Python.h:8:
/usr/include/python3.9/pyconfig.h:9:12: fatal error: 'aarch64-linux-gnu/python3.9/pyconfig.h' file not found
打开报错文件可见该行代码:#include <aarch64-linux-gnu/python3.9/pyconfig.h>,系统正在搜索该文件。执行sudo find / -name "aarch64-linux-gnu"确认文件已安装,且在/usr/include/aarch64-linux-gnu下找到python3.9/pyconfig.h。
操作步骤:
sudo git clone https://github.com/tensorflow/tensorflow.git /home/user/Desktop/official_stuff/tensorflow_srccurl -LO https://storage.googleapis.com/mirror.tensorflow.org/developer.arm.com/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xzmkdir -p ${HOME}/toolchainstar xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C ${HOME}/toolchains- 执行CMake命令:
ARMCC_PREFIX=${HOME}/toolchains/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu- ARMCC_FLAGS="-funsafe-math-optimizations" cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \ -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \ -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \ -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DCMAKE_SYSTEM_NAME=Linux \ -DCMAKE_SYSTEM_PROCESSOR=aarch64 \ ../tensorflow/lite/
- 执行
dpkg --add-architecture arm64、apt-get update、sudo apt install libpython3-dev:arm64 - 连接Android设备后点击构建/运行,编译抛出上述错误。
CMake代码片段:
set(TENSORFLOW_SOURCE_DIR "" CACHE PATH "Directory that contains the TensorFlow project" ) if(NOT TENSORFLOW_SOURCE_DIR) get_filename_component(TENSORFLOW_SOURCE_DIR "/home/user/Desktop/official_stuff/tensorflow_src" ABSOLUTE) endif() add_library(tensorflowlite SHARED IMPORTED) add_subdirectory( "/home/user/Desktop/official_stuff/tensorflow_src/tensorflow/lite" "${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite" EXCLUDE_FROM_ALL ) ... target_link_libraries( my_proj tensorflow-lite )
环境:Debian 11
核心问题分析
你的编译配置混淆了Linux aarch64交叉编译和Android NDK编译:你用了针对Linux的aarch64工具链,但实际要编译的是Android平台的TFLite,Android的系统ABI是arm64-v8a,和Linux aarch64的头文件路径、系统库结构完全不同,导致Python交叉编译头文件路径匹配失败。
具体修复步骤
替换工具链为Android NDK
放弃手动下载的Linux aarch64 GCC工具链,改用Android Studio自带的NDK(推荐r21e及以上版本,兼容性更好)。在CMake中指定NDK的工具链文件:set(ANDROID_NDK "/path/to/your/android/ndk") # 示例路径:~/Android/Sdk/ndk/25.2.9519653 set(CMAKE_TOOLCHAIN_FILE "${ANDROID_NDK}/build/cmake/android.toolchain.cmake") set(ANDROID_ABI "arm64-v8a") set(ANDROID_PLATFORM android-24) # 适配你的设备最低API等级禁用Python相关模块编译
Android项目不需要TFLite的Python绑定(interpreter_wrapper/numpy.cc属于Python模块),在CMake中添加编译选项关闭Python支持:set(TFLITE_ENABLE_PYTHON OFF CACHE BOOL "")或者在执行CMake命令时追加参数:
cmake ... -DTFLITE_ENABLE_PYTHON=OFF ../tensorflow/lite/修正CMake交叉编译配置
移除原CMake命令中针对Linux的配置,改为Android平台的标准交叉编译参数:cmake -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-24 \ -DCMAKE_C_FLAGS="-funsafe-math-optimizations" \ -DCMAKE_CXX_FLAGS="-funsafe-math-optimizations" \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DTFLITE_ENABLE_PYTHON=OFF \ ../tensorflow/lite/清理旧构建目录重新编译
删除之前的CMake构建目录,避免旧配置残留:rm -rf build && mkdir build && cd build # 重新执行上述修正后的CMake命令
额外验证
如果仍有头文件路径问题,手动指定arm64 Python头文件的搜索路径到CMake中:
include_directories(/usr/include/aarch64-linux-gnu/python3.9)
但优先推荐关闭Python支持,因为Android应用通常不需要TFLite的Python接口。
内容的提问来源于stack exchange,提问作者Turgut

