使用CMake和NDK 26b构建TFLite 2.14.0静态库遇链接错误求助
关于NDK 26b构建TFLite 2.14.0静态库的链接错误问题
有没有人成功用CMake和NDK 26b为Android原生项目构建TFLite 2.14.0静态库?我能通过NDK 26b构建出TensorFlow 2.14.0 Lite静态库,但后续在项目中使用时出现大量未定义符号的链接错误。
已知TensorFlow推荐的稳定构建NDK版本是21e,查过TensorFlow的Git问题页面没找到满意的解决方案,部分帖子提到TensorFlow可能支持NDK 25c,但用这个版本构建也会出现同样的问题。
我的CMake构建命令如下:
cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_ROOT/build/cmake/android.toolchain.cmake \ -DCMAKE_BUILD_TYPE=Release -DANDROID_ABI=arm64-v8a -DANDROID_NATIVE_API_LEVEL=28 \ -DTFLITE_ENABLE_RUY=OFF -DTFLITE_ENABLE_NNAPI=OFF -DTFLITE_ENABLE_GPU=OFF \ -DTFLITE_ENABLE_XNNPACK=OFF -DTFLITE_ENABLE_MMAP=OFF \ -DTENSORFLOW_LITE_BUILD_STATIC_LIBS=ON ../tensorflow/lite cmake --build . -j 8
其中NDK_ROOT指向NDK 26b(也曾尝试NDK 25c)的根目录。
奇怪的是,即使通过-DTFLITE_ENABLE_RUY=OFF禁用RUY,配置后仍显示RUY处于启用状态。生成的libtensorflow-lite.a静态库看似正常,但在项目中使用时出现大量RUY及rfft2d相关的未定义符号链接错误(部分深层符号引用已省略):
ld.lld: error: undefined symbol: ruy::get_ctx(ruy::Context*) >>> referenced by ruy.h:47 (ruy/ruy/ruy.h:47) ld.lld: error: undefined symbol: ruy::Ctx::clear_performance_advisories() >>> referenced by frontend.h:90 (ruy/ruy/frontend.h:90) ld.lld: error: undefined symbol: ruy::MulFrontEndFromTrMulParams(ruy::Ctx*, ruy::TrMulParams*) >>> referenced by frontend.h:94 (ruy/ruy/frontend.h:94) ld.lld: error: undefined symbol: ruy::Ctx::SelectPath(ruy::Path) >>> referenced by create_trmul_params.h:423 (ruy/ruy/create_trmul_params.h:423) ld.lld: error: undefined symbol: rdft2d >>> referenced by rfft2d.cc:308 (/Developer/ThirdParty/TensorFlow/tensorflow-2.14.0/tensorflow/lite/kernels/rfft2d.cc:308) ld.lld: error: undefined symbol: ruy::Context::mutable_thread_pool() ld.lld: error: undefined symbol: ruy::ThreadPool::ExecuteImpl(int, int, ruy::Task*) >>> referenced by thread_pool.h:77 (ruy/ruy/thread_pool.h:77) ld.lld: error: undefined symbol: util::Fingerprint64(char const*, unsigned long) ld.lld: error: undefined symbol: ruy::Context::set_max_num_threads(int) ld.lld: error: undefined symbol: ruy::Context::Context() ld.lld: error: undefined symbol: pthreadpool_destroy ld.lld: error: undefined symbol: flatbuffers::ClassicLocale::instance_ ld.lld: error: undefined symbol: ruy::Ctx::set_performance_advisory(ruy::PerformanceAdvisory) ld.lld: error: undefined symbol: ruy::Ctx::GetMainAllocator() ld.lld: error: undefined symbol: ruy::Kernel8bitNeonDotprod1Col(ruy::KernelParams8bit<8, 8> const&) ld.lld: error: undefined symbol: ruy::Kernel8bitNeonDotprodA55ish(ruy::KernelParams8bit<8, 8> const&) >>> referenced by kernel_arm.h:125 (ruy/ruy/kernel_arm.h:125) ld.lld: error: undefined symbol: ruy::Kernel8bitNeonDotprodX1(ruy::KernelParams8bit<8, 8> const&) >>> referenced by kernel_arm.h:127 (ruy/ruy/kernel_arm.h:127) ld.lld: error: undefined symbol: ruy::Kernel8bitNeonDotprod(ruy::KernelParams8bit<8, 8> const&) >>> referenced by kernel_arm.h:129 (ruy/ruy/kernel_arm.h:129) ld.lld: error: undefined symbol: ruy::Context::~Context() ld.lld: error: undefined symbol: ruy::Kernel8bitNeon1Col(ruy::KernelParams8bit<4, 4> const&) >>> referenced by kernel_arm.h:70 (ruy/ruy/kernel_arm.h:70) ld.lld: error: too many errors emitted, stopping now (use --error-limit=0 to see all errors) clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed.
用objdump/nm工具查看,确认这些符号确实未定义。而使用NDK 21e构建TensorFlow 2.0.0时,项目可正常构建运行。
内容的提问来源于stack exchange,提问作者Knight Forked
相关产品推荐
相关产品推荐

