React Native iOS端构建失败 RCTTurboModuleManager.mm编译报错
macOS Monterey下React Native iOS构建失败排查
问题现象
在搭载macOS Monterey的设备上执行npx react-native run-ios命令时构建失败,报错信息如下:
** BUILD FAILED ** The following build commands failed: CompileC /Users/prashanth/Library/Developer/Xcode/DerivedData/myapp-akpvurjcnemajucrerqjfkzzxnng/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/ReactCommon.build/Objects-normal/x86_64/RCTTurboModuleManager.o /Users/prashanth/Documents/REPO/app/node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm normal x86_64 objective-c++ com.apple.compilers.llvm.clang.1_0.compiler (in target 'ReactCommon' from project 'Pods') (1 failure)
现有环境与配置
- Podfile配置:
- iOS最低支持版本:
platform :ios, '9.0' - TurboModule依赖配置:
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
- iOS最低支持版本:
- 工具版本:
- Node:15.14.0
- React Native:0.62.2
- Xcode:13.4.1
修复步骤
这个报错的核心原因是React Native 0.62.2发布时间远早于Xcode 13.4.1,新旧版本存在编译器兼容、部署目标不匹配的问题,按以下顺序操作即可修复:
- 调高iOS最低部署版本
Xcode 13已不再支持iOS 9的编译目标,打开项目ios目录下的Podfile,将首行的platform :ios, '9.0'修改为platform :ios, '12.4'。 - 添加Pod编译配置修正逻辑
在Podfile最末尾添加如下post_install钩子,自动修正Pods依赖的编译参数,避免C++/OC语言标准不匹配、部署目标过低的问题:post_install do |installer| installer.pods_project.targets.each do |target| # 单独给ReactCommon设置兼容编译参数 if target.name == "ReactCommon" target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.4' config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17' config.build_settings['GCC_C_LANGUAGE_STANDARD'] = 'gnu11' end end # 统一修正所有依赖的最低部署版本 target.build_configurations.each do |config| if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 12.4 config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.4' end end end end - 全量清理缓存后重新构建
在项目根目录依次执行以下命令,清除旧的编译缓存和依赖后重新构建:- 清除Xcode派生数据:
rm -rf ~/Library/Developer/Xcode/DerivedData/* - 进入ios目录清除旧依赖:
cd ios && rm -rf Pods Podfile.lock build - 重新安装Pod依赖:
pod install --repo-update - 返回根目录重新执行构建:
cd .. && npx react-native run-ios
- 清除Xcode派生数据:
如果完成以上步骤后依然报相同编译错误,手动打开node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm文件,给所有调用RCTBridgeModuleNameForClass方法的位置增加空值判断即可——Xcode 13的clang编译器对OC空值校验更严格,旧版RN代码缺失判空逻辑会直接触发编译失败。
内容的提问来源于stack exchange,提问作者Gnana
相关产品推荐
相关产品推荐

