引入预编译FirebaseFirestore后Flutter iOS编译报错:链接器退出码1
问题概述
在Flutter项目Podfile中引入invertase预编译版本的FirebaseFirestore(tag 10.18.0)后,构建iPhone 13 Pro模拟器时出现Undefined symbols链接错误,链接器退出码1。
可能的解决方案
1. 调整Podfile中FirebaseFirestore的引入顺序
当前Podfile中先声明预编译FirebaseFirestore,再执行flutter_install_all_ios_pods,可能导致FlutterFire自动引入的FirebaseFirestore与预编译版本冲突。修改Podfile,将预编译pod声明移到flutter_install_all_ios_pods之后:
target 'Runner' do use_frameworks! use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) # 移到此处,确保覆盖自动引入的版本 pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '10.18.0' target 'RunnerTests' do inherit! :search_paths end end
2. 验证预编译框架的架构支持
Xcode 15之后,Apple Silicon Mac的模拟器使用arm64架构,部分旧版本预编译FirebaseFirestore可能未包含该架构。执行以下命令检查架构:
cd ios/Pods/FirebaseFirestore lipo -info FirebaseFirestore.framework/FirebaseFirestore
如果输出中没有arm64(模拟器)或x86_64(Intel Mac模拟器),则需要更换包含全架构的tag版本(比如尝试10.22.0及以上)。
3. 彻底清理缓存并重新安装依赖
缓存冲突是常见原因,执行以下步骤:
- 删除ios目录下的
Pods文件夹和Podfile.lock文件 - 执行项目根目录的
flutter clean - 进入ios目录,执行
pod install --repo-update - 打开Xcode,按
Cmd+Shift+K清理构建缓存,再重新构建项目
4. 适配Xcode 15链接器设置
Xcode 15默认使用新的ld链接器,可能与预编译框架不兼容。在Podfile的post_install中添加链接器兼容设置:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.1' # 添加Xcode15链接器兼容设置 config.build_settings['OTHER_LDFLAGS'] = '-ld64' end end end
5. 确认FlutterFire与iOS SDK版本兼容性
确保pubspec.yaml中Firebase相关Flutter包(如firebase_core、cloud_firestore)的版本与iOS Firebase SDK 10.18.0兼容。若不匹配则调整pubspec中的依赖版本后,重新执行flutter pub get和pod install。
内容的提问来源于stack exchange,提问作者Sami Issa

