React Native源码编译Yoga模块报错:依赖文件路径异常求助
问题:编译React Native源码时Yoga模块出现依赖文件路径异常报错
我为了使用自行修改的Camera Roll功能,尝试从源码编译React Native。已遵循官方编译指南操作,但编译全程遇到晦涩的Yoga模块报错,核心问题是生成的依赖文件路径明显异常(路径里重复了绝对路径,还出现了__这样的错误拼接),完整报错信息如下:
[armeabi-v7a] Compile++ thumb: yogacore <= Utils.cpp [armeabi-v7a] Compile++ thumb: yogacore <= YGEnums.cpp [armeabi-v7a] Compile++ thumb: yogacore <= YGNodePrint.cpp [armeabi-v7a] Compile++ thumb: yogacore <= YGNode.cpp [armeabi-v7a] Compile++ thumb: yogacore <= Yoga.cpp C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/YGEnums.cpp:228:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGEnums.o.d: No such file or directory } ^ compilation terminated. make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGEnums.o] Error 1 make.exe: *** Waiting for unfinished jobs.... [armeabi-v7a] StaticLibrary : libreactnative.a C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/YGNodePrint.cpp:227:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNodePrint.o.d: No such file or directory } // namespace facebook ^ compilation terminated. make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNodePrint.o] Error 1 C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/Utils.cpp:31:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Utils.o.d: No such file or directory } ^ compilation terminated. make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Utils.o] Error 1 C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/YGNode.cpp:668:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNode.o.d: No such file or directory } ^ compilation terminated. make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/YGNode.o] Error 1 C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/../ReactCommon/yoga/yoga/Yoga.cpp:3493:1: fatal error: opening dependency file C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Yoga.o.d: No such file or directory } ^ compilation terminated. make.exe: *** [C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp\node_modules\react-native\ReactAndroid\build\tmp\buildReactNdkLib/local/armeabi-v7a/objs/yogacore/C_/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/__/ReactCommon/yoga/yoga/Yoga.o] Error 1 make.exe: Leaving directory `C:/Users/jon-g/OneDrive/Documents/GitHub/kulaapp/node_modules/react-native/ReactAndroid/src/main/jni/react/jni' :ReactAndroid:buildReactNdkLib FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':ReactAndroid:buildReactNdkLib'. > Process 'command 'C:\Users\jon-g\AppData\Local\Android\Ndk\android-ndk-r10e\ndk-build.cmd'' finished with non-zero exit value 2 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED
我无法理解问题原因,请问该如何解决以完成编译?
解决方案
这个问题本质是Windows路径下NDK构建工具对相对路径转绝对路径时的拼接错误,尤其是你的项目放在OneDrive目录下(旧版NDK对这类同步目录的路径处理存在bug),结合报错里的路径重复(C_/Users/...和__),给你几个逐步排查的解决方法:
方法1:移动项目到非OneDrive、无空格的短路径目录
NDK r10e是比较旧的版本(很多React Native旧版本依赖它),对Windows的特殊目录(比如OneDrive、带空格的用户目录)支持很差,路径拼接时会把相对路径../错误转换成__,同时把盘符C:错误转成C_。
- 把你的项目从
C:\Users\jon-g\OneDrive\Documents\GitHub\kulaapp移动到比如C:\dev\kulaapp这样的短路径、非同步目录下 - 清空之前的构建缓存:
cd 项目根目录 gradlew clean rm -rf node_modules/.cache rm -rf android/build - 重新执行编译命令
这是最直接有效的方法,很多RN旧版本编译的Windows路径问题都能这么解决。
方法2:升级NDK版本(谨慎操作,需适配RN版本)
如果你不想移动项目,可以尝试升级NDK到更高版本(比如r16b或r17c,这些版本对Windows路径的处理更完善),但要注意:
- 旧版本的React Native(比如0.5x及以下)可能依赖特定版本的NDK,升级后可能出现其他兼容性问题
- 修改React Android模块的NDK配置:
- 打开
node_modules/react-native/ReactAndroid/build.gradle - 找到
ndkVersion配置项,替换成你安装的高版本NDK编号 - 清空构建缓存后重新编译
- 打开
方法3:手动修复Yoga模块的路径配置
如果上面两种方法都不行,你可以手动调整Yoga的NDK构建脚本,修正路径拼接:
- 打开
node_modules/react-native/ReactCommon/yoga/yoga/Android.mk - 找到
LOCAL_SRC_FILES对应的路径,把相对路径../替换成绝对路径,或者调整为相对于ReactAndroid目录的路径 - 保存后清空缓存重新编译
不过这种方法需要对NDK构建脚本有一定了解,而且每次重新安装依赖后都要重新修改,比较麻烦。
额外提示
- 确保你的Windows用户名没有空格或特殊字符(比如
jon-g是没问题的,但如果是Jon Doe就容易出问题) - 编译时尽量用Git Bash或者PowerShell,避免用Windows自带的命令提示符(CMD),因为CMD对路径的处理和Unix风格的shell有差异
内容的提问来源于stack exchange,提问作者Socratease
相关产品推荐
相关产品推荐

