Troubleshooting
Failures that come from how a project is set up rather than from the library itself. Each one is reproducible, so the symptom is quoted exactly — search this page for the error you got.
Build input files cannot be found after install
error: Build input files cannot be found:
'.../XnnpackBackend.xcframework/ios-arm64-simulator/libXnnpackBackend.a'
The native artifacts are not in the npm tarball. They are downloaded by a postinstall hook, and your package manager skipped it:
- pnpm 10 and later block dependency build scripts by default and print
Ignored build scripts: react-native-executorchduring install. --ignore-scripts, andnpm ci --ignore-scripts, do the same.
Nothing fails at that point — not even pod install, which does not check that
a vendored framework exists — so the error only appears once Xcode goes looking
for the file. Recent versions fail during pod install (and during the Android
configure phase) with this fix in the message instead. Re-run the hook:
pnpm approve-builds react-native-executorch # pnpm
npm rebuild react-native-executorch # npm
node node_modules/react-native-executorch/scripts/download-libs.js
Multiple commands produce .../Headers/Types.h
An app built with use_frameworks! — directly, as Firebase requires, or through
expo-build-properties' "useFrameworks": "static" — makes CocoaPods build the
pod as a framework and flat-copy its public headers into one directory.
Versions up to 0.10.0 published every header, and several share a basename, so
the build fails while it is still being planned.
Update the library. On 0.10.0 exactly, force the pod back to a static library:
pre_install do |installer|
installer.pod_targets.each do |pod|
if pod.name == 'react-native-executorch'
def pod.build_type
Pod::BuildType.static_library
end
end
end
end
Expo SDK 55 and later already do this for you: their autolinking downgrades
every pod that vendors an .xcframework to a static library, which is why an
Expo app usually never sees this. Setting buildReactNativeFromSource: true
turns that off again.
transitive dependencies that include statically linked binaries
[!] The 'Pods-YourApp' target has transitive dependencies that include
statically linked binaries: (.../opencv-rne/opencv2.xcframework)
use_frameworks! with no argument means dynamic linkage, which CocoaPods
refuses to combine with a statically linked dependency. Ask for static
frameworks instead:
use_frameworks! :linkage => :static
frameworks with conflicting names: opencv2.xcframework
Another pod vendors OpenCV under the same framework name — react-native-fast-opencv
(via FastOpenCV-iOS) is the common one — and CocoaPods installs only one
framework called opencv2.
Recent versions handle this for you: when react-native-fast-opencv is
installed alongside this library, we depend on the OpenCV it vendors instead of
our own, and compile against that copy's headers. pod install prints which one
it chose. Nothing to configure, and both libraries work in the same app.
To force the choice, name the pod that should provide OpenCV:
{
"react-native-executorch": {
"opencvPod": "opencv-rne"
}
}
opencv-rne is ours; any pod that vendors an opencv2.xcframework is accepted.
We only use opencv2/core.hpp and opencv2/imgproc.hpp, so an OpenCV 4.x build
serves. Forcing ours while another OpenCV is installed brings the conflict back,
which is what the setting is for when you would rather drop the other library.
If you do not use this library's vision tasks at all, drop its OpenCV instead:
{
"react-native-executorch": {
"backends": ["xnnpack", "coreml", "mlx"],
"libs": ["phonemis"]
}
}
Re-run your package manager's install afterwards. See
Native Libraries for what each
entry covers — leaving opencv out disables every computer-vision task.
None of the architectures in ARCHS (x86_64) are valid
The library ships arm64 slices only, and the podspec excludes x86_64 from
simulator builds. Intel Macs cannot build for the iOS simulator, and neither
can an Apple silicon Mac running Xcode under Rosetta, or an Intel macOS CI
image. Use an Apple silicon machine, or a physical device.
The platform of the target ... may not be compatible
[!] The platform of the target `YourApp` (iOS 16.4) may not be compatible with
`react-native-executorch (0.10.0)` which has a minimum requirement of iOS 17.0.
This is a warning, so pod install still succeeds and the failure surfaces
later. The library needs iOS 17. In an Expo app, set it explicitly — the default
is lower:
[
"expo-build-properties",
{ "ios": { "deploymentTarget": "17.0" } }
]
The react-native-executorch config block is ignored
The postinstall hook reads the block from the directory where the install was
invoked (INIT_CWD), then from every package.json above the installed
package. In a hoisted monorepo both land on the workspace root, so a block
in apps/mobile/package.json is never seen — put it in the root package.json
instead. The install log names the manifest that won, and
node_modules/react-native-executorch/rne-build-config.json records which flags
were written.
An old Android device or emulator crashes on load
Native code is shipped for arm64-v8a and x86_64 only. A build that also
produces armeabi-v7a or x86 splits (React Native's default
reactNativeArchitectures lists all four) will package those without the
library's .so, and loading it fails at runtime on such a device. Restrict the
app to the supported ABIs:
reactNativeArchitectures=arm64-v8a,x86_64