Flutter导出tflite_flutter至iOS原生项目遇符号查找失败求助
问题场景
环境:Flutter 3.7.0、Xcode 14;依赖:tflite_flutter 0.10.4
将Flutter模块导出为Framework集成到iOS原生项目后,运行时报错:
Unhandled Exception: Invalid argument(s): Failed to lookup symbol 'TfLiteInterpreterOptionsCreate': dlsym(RTLD_DEFAULT, TfLiteInterpreterOptionsCreate): symbol not found #0 DynamicLibrary.lookup (dart:ffi-patch/ffi_dynamic_library_patch.dart:33) #1 TensorFlowLiteBindings._TfLiteInterpreterOptionsCreatePtr (package:tflite_flutter/src/bindings/tensorflow_lite_bindings_generated.dart:336) #2 TensorFlowLiteBindings._TfLiteInterpreterOptionsCreate (package:tflite_flutter/src/bindings/tensorflow_lite_bindings_generated.dart) #3 TensorFlowLiteBindings.TfLiteInterpreterOptionsCreate (package:tflite_flutter/src/bindings/tensorflow_lite_bindings_generated.dart) #4 new InterpreterOptions (package:tflite_flutter/src/interpreter_options.dart:36) #5 Detector._loadModel (package:tf_module/service/detector_service.dart:109) #6 Detector.start (package:tf_module/service/detector_service.dart:99) <asynchronous suspension>
已尝试修改Xcode中Target Runner>Build Settings>Strip Style为Non-Global Symbols,未生效。
解决方案
确认TensorFlow Lite库的嵌入状态
导出Flutter Framework后,检查原生iOS项目的Frameworks, Libraries, and Embedded Content中是否包含libtensorflowlite_c.framework。如果没有,从Flutter项目的ios/Pods/tflite_flutter路径下找到该框架,添加到原生项目中,并设置Embed选项为Embed & Sign。调整原生主Target的符号剥离配置
不要只修改Runner Target,需要针对原生项目的主Target修改以下Build Settings:- 将
Strip Debug Symbols During Copy设置为NO - 将
Strip Style设置为Non-Global Symbols - 将
Dead Code Stripping设置为NO
- 将
更新tflite_flutter依赖版本
tflite_flutter 0.10.4与Flutter 3.7.0、Xcode 14的兼容性存在问题,执行flutter pub upgrade tflite_flutter升级到最新稳定版(如0.14.0+),之后重新导出Flutter Framework并集成。手动指定动态库加载路径
在Flutter代码初始化Interpreter时,手动指定TensorFlow Lite库的路径,避免动态库查找失败:import 'dart:ffi'; import 'dart:io'; import 'package:path/path.dart' as path; import 'package:tflite_flutter/tflite_flutter.dart'; Future<void> loadModel() async { final libraryPath = path.join( Directory.current.path, 'Frameworks', 'libtensorflowlite_c.framework', 'libtensorflowlite_c', ); final dylib = DynamicLibrary.open(libraryPath); final interpreter = await Interpreter.fromAsset( 'your_model.tflite', dylib: dylib, options: InterpreterOptions()..useGpuDelegate = false, ); // 后续模型操作 }
内容的提问来源于stack exchange,提问作者Ray Gu

