Xcode报5 duplicate symbols for architecture x86_64错误如何解决
问题根因
- 触发
5 duplicate symbols for architecture x86_64报错的核心原因是项目中同时引入了已停止维护的rn-fetch-blob与其社区继任分叉库react-native-blob-util,两个库对外暴露了同名全局符号(_bridgeRef/_fsQueue/_fileStreams),M1芯片运行iOS模拟器时走x86_64转译链路,链接阶段识别到重复符号直接终止编译。 - 直接卸载
rn-fetch-blob后触发的新报错,是因为项目内存在其他第三方依赖隐式引用了rn-fetch-blob,粗暴移除后会出现依赖缺失、头文件找不到的编译错误。
关于react-native-blob-util的替代说明
react-native-blob-util是rn-fetch-blob官方停止维护后,由原社区核心贡献者发起的正式维护分叉版本,API与原rn-fetch-blob100%兼容,可无缝替换,同时修复了原库存在的M1适配、iOS15+/Android12+系统兼容等大量已知问题,是目前官方推荐的替代方案。
修复步骤(推荐方案:无缝替换到维护版)
- 移除旧版冲突依赖
# npm用户执行 npm uninstall rn-fetch-blob # yarn用户执行 yarn remove rn-fetch-blob - 排查隐式依赖,强制全局替换
执行依赖排查命令找到所有引用旧版rn-fetch-blob的包:
如果存在第三方依赖强制绑定了旧版# npm用户执行 npm ls rn-fetch-blob # yarn用户执行 yarn why rn-fetch-blobrn-fetch-blob,直接在项目package.json中添加resolutions字段,全局强制替换依赖:"resolutions": { "rn-fetch-blob": "npm:react-native-blob-util@^0.17.0" } - 全量清理缓存重装依赖
# 清理JS侧缓存 watchman watch-del-all rm -rf node_modules yarn.lock package-lock.json # npm用户执行npm install,yarn用户执行yarn install npm install # 清理iOS侧构建缓存 cd ios rm -rf Pods Podfile.lock build pod deintegrate arch -x86_64 pod install --repo-update cd .. - 替换代码引用
全局搜索项目内所有引用语句,将import RNFetchBlob from 'rn-fetch-blob'统一替换为import RNFetchBlob from 'react-native-blob-util'即可,所有方法名、传参、返回值完全一致,不需要修改任何业务逻辑代码。 - Xcode适配M1配置
打开Xcode项目,在Build Settings中找到Excluded Architectures选项,针对iOS Simulator SDK添加arm64排除项,清理Xcode构建缓存(快捷键Cmd+Shift+K)后重新编译即可。
临时修复方案(不推荐,仅应急使用)
如果短时间内无法完成依赖替换,可以通过修改旧库源码的方式临时解决符号冲突:
- 打开
node_modules/rn-fetch-blob/ios目录下的RNFetchBlob.m、RNFetchBlobFS.m、RNFetchBlobNetwork.m三个文件 - 找到文件顶部定义的
_bridgeRef、_fsQueue、_fileStreams全局变量,在变量类型前添加static关键字,将全局可见变量修改为文件内私有变量,避免符号对外导出冲突 - 重新执行
pod install,清理Xcode缓存后即可编译通过
注意:该方案为临时补丁,每次执行npm/yarn重装依赖后修改会被覆盖,且原rn-fetch-blob已停止维护超过2年,后续系统版本升级会出现更多兼容问题,建议尽快切换到官方维护版本。
内容的提问来源于stack exchange,提问作者AJDee
相关产品推荐
相关产品推荐

