Unity集成Firebase构建Xcode时遇Undefined Symbols错误求助
环境版本
- Firebase 10.20.0
- Unity 2022.3.20f1
- Xcode 15.2
- MacOS 14.3.1
- iOS设备系统:16.4.1
问题详情
我开发了一个集成Firebase Firestore的简单Unity项目,在Unity编辑器内运行完全正常,也能成功导出Xcode工程,但用Xcode打包到iPhone时直接失败,报链接错误:
ld: Undefined symbols:
_Firebase_Firestore_CSharp_USE_FIRESTORE_FUTURE_VOID_get, referenced from:
_FirestoreCppPINVOKE_USE_FIRESTORE_FUTURE_VOID_get_m7B1C87EAC194B1820A555C55DD80D14E09D43D04 in libGameAssembly.a4
_FirestoreCpp__cctor_m01F392D9C6AE94A071E8F744E8129BB34E246734 in libGameAssembly.a4
clang: error: linker command failed with exit code 1 (use -v to see invocation)
另外还有个疑问:错误摘要里显示使用的是iOS 17.2 SDK,但我的设备系统是16.4.1,这两者不匹配是怎么回事?
已尝试的无效方案
- 添加/移除Firebase Authentication依赖
- 在UnityFramework的Build Settings中添加
-Id64到Other Linker Flags - 降级Firebase到9.6.0版本
- 执行
pod deintegrate && pod cache clean --all后重新pod install - 删除
/Pods文件夹后重新执行pod install - 删除Xcode的DerivedData缓存
这些操作都没解决问题,之前还出现过Arm64相关的错误,但现在无法复现,每次打包都会触发这个链接错误,急需解决办法。
解决建议
1. 修正Unity端的IL2CPP与架构配置
Firebase对IL2CPP后端的支持更稳定,先确认Unity的Player Settings配置:
- 切换
Scripting Backend为IL2CPP(iOS平台默认应该是这个,但检查一下) - 在
Architecture选项中只勾选ARM64(不要选Universal或x86_64,针对真机打包) - 如果开启了
Strip Engine Code,在Linker Striping的Additional Linker Flags里添加-u _Firebase_Firestore_CSharp_USE_FIRESTORE_FUTURE_VOID_get,强制链接器保留缺失的符号
2. 统一Xcode的部署目标与SDK版本
错误里显示iOS 17.2是因为Xcode 15.2默认自带的是最新SDK,这是正常的——Xcode用高版本SDK打包低版本系统的APP是允许的,只要把部署目标设对就行:
- 在Xcode中选中
Unity-iPhone主目标,进入General选项卡,把iOS Deployment Target改成16.4 - 同步修改
UnityFramework目标的Deployment Target,确保和主目标一致
3. 重新导入并解析Firebase依赖
可能是Unity导出的绑定文件损坏,重新走一遍依赖流程:
- 删除Unity项目中
Assets/Firebase整个文件夹,重新下载对应版本的Firebase Unity SDK(10.20.0支持Unity 2022.x)并导入 - 导出Xcode工程前,执行
Assets > Firebase > Resolve > Resolve Client Libraries,确保所有iOS依赖都正确解析
4. 修正Xcode的链接器配置
检查UnityFramework的Build Settings:
- 找到
Other Linker Flags,确保里面包含-ObjC(Firebase需要这个标志加载类别) - 之前加的
-Id64大概率是笔误,改成-arch arm64或者直接移除,让Unity自动配置架构参数
5. 验证Firestore原生库是否正确引入
导出Xcode工程后,检查Pods/FirebaseFirestore目录下是否有libFirebaseFirestore.a等原生库文件,同时确认UnityFramework的Build Phases > Link Binary With Libraries中已经正确引用这些库。如果缺失,重新执行pod install时确保网络稳定,避免依赖下载失败。
内容的提问来源于stack exchange,提问作者Paul Provan

