RN0.66.4 M1设备iOS构建Realm arm64未定义符号报错如何解决
问题根因
这个arm64架构下的Realm符号缺失报错是两个核心问题叠加导致的,常规清缓存操作无法触达问题根源所以无效:
- C编译标准不匹配:Realm JS 2.29.0的原生桥接逻辑是基于C14标准编译的Realm Core 3.17.3做的符号绑定,而Xcode 13.4.1编译源码版Realm 3.17.3时默认用C17标准,不同C标准的符号修饰规则不一致,直接导致
realm::BpTreeBase::replace_root这类内部C++方法符号无法被链接器识别。 - M1架构配置失效:RN 0.60.5版本的CocoaPods默认配置会自动排除模拟器arm64架构,而跨版本升级到0.66.4后这个配置被重置,3.x版本的Realm静态库没有提供模拟器arm64架构切片,链接时会直接报架构相关的符号错误。
修复方案
根据你是否可以升级Realm版本,二选一操作即可:
方案一:升级Realm版本(推荐,长期兼容M1/Xcode新版本)
如果项目没有强依赖老版本Realm的API,直接升级到RN 0.66.x兼容的Realm版本即可,不需要手动改特殊配置:
- 在项目根目录执行命令移除旧版依赖:
rm -rf ios/Pods ios/Podfile.lock yarn remove realm # npm用户替换为 npm uninstall realm --save
- 安装适配RN0.66.4的Realm版本:
yarn add realm@10.12.0 # npm用户替换为 npm install realm@10.12.0 --save
- 重新安装iOS依赖:
cd ios pod deintegrate pod install --repo-update
- 打开Xcode按
Cmd+Shift+K清理构建缓存后,直接重新构建即可。
方案二:保留现有Realm 2.29.0/3.17.3版本
如果项目逻辑强依赖老版本Realm API,手动修改Podfile配置修正编译规则和架构即可:
- 打开ios目录下的Podfile,找到
post_install钩子,替换为如下配置:
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # 排除模拟器arm64架构,适配老版本Realm无对应切片的问题 config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' # 强制用C++14标准编译,匹配Realm JS的符号绑定规则 config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++14' config.build_settings['CLANG_CXX_LIBRARY'] = 'libc++' # 补全C++基础库链接参数 config.build_settings['OTHER_LDFLAGS'] ||= ['$(inherited)', '-lc++'] end end # 单独关闭Realm的bitcode,避免Xcode13下老版本Realm bitcode编译失败 realm_target = installer.pods_project.targets.find { |t| t.name == 'Realm' } if realm_target realm_target.build_configurations.each do |config| config.build_settings['ENABLE_BITCODE'] = 'NO' end end end
- 执行命令全量清理缓存并重装依赖:
# 清理CocoaPods本地缓存的Realm包 pod cache clean Realm --all # 清理本地Pods、锁文件和Xcode构建缓存 rm -rf ios/Pods ios/Podfile.lock ~/Library/Developer/Xcode/DerivedData/* # 重新安装依赖 cd ios pod install
- 打开Xcode,选中主项目target,在Build Settings页确认两项配置:
Excluded Architectures> 模拟器SDK 对应值为arm64C++ Language Dialect对应值为c++14
确认后重新构建即可。
校验方法
如果执行完上述操作仍然报符号错误,在终端执行如下命令检查libRealm.a支持的架构列表:
lipo -info ios/Pods/Realm/core/libRealm.a
如果输出结果里没有arm64,说明本地拉取的Realm包是预编译的x86_64版本,直接删除ios/Pods/Realm目录后重新执行pod install即可。
内容的提问来源于stack exchange,提问作者Saif Ali Khan
相关产品推荐
相关产品推荐

