I'm hitting a persistent iOS linker error on EAS Build with Expo SDK 54 and React Native 0.81.5 that I haven't been able to resolve across dozens of attempts. The same error occurs on both Xcode 16.2 and Xcode 26.
Environment:
Expo SDK:
54.0.34React Native:
0.81.5expo-router:
~6.0.23react-native-reanimated:
~4.1.1EAS Build image:
macos-sequoia-15.3-xcode-16.2(also triedmacos-sequoia-15.5-xcode-26.0)iOS deployment target:
15.1New Architecture: enabled
Hermes: enabled
The error:
Undefined symbols for architecture arm64:
"vtable for hermes::vm::NopCrashManager", referenced from:
hermes::vm::RuntimeConfig::RuntimeConfig() in libExpoModulesCore.a[7](EXJavaScriptRuntime.o)
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"typeinfo for facebook::jsi::HostObject", referenced from:
typeinfo for expo::ExpoModulesHostObject in libExpoModulesCore.a[26](ExpoModulesHostObject.o)
typeinfo for expo::LazyObject in libExpoModulesCore.a[42](LazyObject.o)
typeinfo for facebook::react::TurboModule in libRNReanimated.a[49](ReanimatedModuleProxy.o)
typeinfo for RNScreens::RNScreensTurboModule in libRNScreens.a[24](RNScreensTurboModule.o)
typeinfo for worklets::JSIWorkletsModuleProxy in libRNWorklets.a[12](JSIWorkletsModuleProxy.o)
"typeinfo for facebook::jsi::NativeState", referenced from:
typeinfo for expo::EventEmitter::NativeState in libExpoModulesCore.a[3](EventEmitter.o)
"typeinfo for facebook::jsi::JSIException", referenced from:
GCC_except_table32 in libExpoModulesCore.a[7](EXJavaScriptRuntime.o)
"typeinfo for facebook::jsi::JSINativeException", referenced from:
... in libRNReanimated.a, libRNWorklets.a
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1
What I've identified:
The references to [abi:ne180100] in the symbol names suggest libExpoModulesCore.a and libRNReanimated.a were compiled against headers expecting one C++ ABI tag, while the prebuilt React Native frameworks pulled in by EAS (React-Core-prebuilt, ReactNativeDependencies) export a different ABI version. Specifically, NopCrashManager, HostObject, NativeState, JSIException, JSINativeException, and Buffer all live in the prebuilt Hermes/JSI binaries but aren't being exported in a form the locally compiled .a files can link against.
What I've tried:
Toggling New Architecture (
newArchEnabled) on and off — same error either way.Switching EAS build image between
xcode-16.2andxcode-26.0.Setting
buildReactNativeFromSource: trueinexpo-build-propertiesplugin to force RN compilation from source instead of prebuilts — fails with the same linker error.Removing and reinstalling
react-native-reanimated— error persists regardless.Removing the entire committed
ios/folder so EAS runs a cleanexpo prebuildon every build — same error.Various
OTHER_CPLUSPLUSFLAGSinjections including-DFOLLY_CFG_NO_COROUTINES=1viaPodfilepost_install hook (correctly handling both String and Array build setting types).
My main question:
Is there a known way to force the prebuilt React-Core-prebuilt and ReactNativeDependencies xcframeworks to align ABI with locally compiled native modules in Expo SDK 54 / RN 0.81.5? Or is this a confirmed incompatibility that requires staying on Expo SDK 53 / RN 0.79 until Expo ships matching prebuilts?
Any insight from anyone who has shipped an Expo SDK 54 production iOS build recently — particularly with react-native-reanimated 4.x and the new architecture — would be hugely appreciated.