react native 0.72遇到react-native-screens库出现cxx编译问题的解决方案

发布时间:2026/6/27 21:00:33

react native 0.72遇到react-native-screens库出现cxx编译问题的解决方案 你好我是千里马是一个程序员软件工程师我负责owo相簿所有相关产品的开发以及维护工作最近这两天我遇到了一个棘手的问题莫名其妙相簿相关安卓端react native应用没办法完成轻量化编译为此我进行一部分研究但大多无济于事。这是一个涉及技术生态面非常广泛的错误因为react native框架的原因bug的涉及范围非常广泛不仅涵盖到h5系生态而且横跨到安卓sdk生态以及c系列生态属于那种不常见的错误甚至有一定代表性所以也值得写一个技术博客记录一下。首先没办法轻量化编译肯定不行没办法轻量化编译就导致没办法即时修改方便开发工作也方便测试没有轻量化编译会给开发工作带来极大的困难。所以这个bug必须得到解决。第一天所以先看看bug的实际表现未知原因未知修改运行npm run android轻量化打包发布就会无法编译爆出来自于react-native-screens的c编译问题。开始的时候我让人工智能分析分析人工智能给出的解释是因为windows路径字符数量最大范围限制导致的编译失败挺有道理我也为此扩大了windows文件路径但是无济于事问题无法解决。没办法轻量编译那么可以完整编译吗一般可以完整编译就代表没什么大问题如果完整编译也不能成功我们就针对完整编译报出的一切错误进行依次分析就可以了结果是完整编译可以通过甚至于没有爆出cxx问题这点就说明工程本身没什么问题主要问题就是出在环境层面但是我只要轻量化编译就必定会爆出cxx问题。这也是比较奇怪的事情。遇到这种情况我首先觉得主要问题出在缓存所以我清理缓存首先安卓编译缓存react-native-screens编译cxx缓存安卓本身缓存最后甚至于把构建临时下载的缓存也都删了但都无济于事cxx错误依然存在。也说明问题不在缓存到底问题是什么呢我这时其实我也属实是没什么办法了而如果重建呢我不太想重建因为重建太费力气不仅技术投入大而且很多包库还得重新下载支持而最关键的我们在中国大陆网不太好下载美国服务器文件网速会很慢。另外重建我的硬盘也不太行我电脑的c盘空间不多了没办法支持的好再新开一台虚拟机去完成重建这件事。所以我这时选择不要重建毕竟考虑到现实原因嘛这时我也确实是没什么好办法了只能用一个以前备份工程换包实现看了目前只有这一种办法。我知道react native这个环境不太好搞所以当时做全局安全备份的时候就把rn环境也备份了一份感谢曾经的我火速从冷备份盘里面找出来虚拟机文件进行测试功能是否正常如果也出cxx编译问题就说明是我们的版本太老了属于外部原因有一些包通过网络自动更新了而如果没出问题呢说明是我自己的工程原因而测试结果没问题轻量化编译和完整编译都可以。说明是我自己的工程原因所以我选择了换包方案老版本工程换包到新版本换包其实相对来说比较轻松。因此问题也得到了解决我进行了换包落地把缺乏的包都安装上把程序功能也都对应到新版本先进行轻量编译然后进行完整编译没问题也就是趁现在完好的状态对react native工程再备份一份防止未来工作再出相关问题污染。因此做好了第一天的cxx编译错误的修复工作。第二天第二天我进行的工作是一个处理兔宝系统cmd令牌统一化的微小工作这个微小工作涉及到了出现cxx编译问题的安卓工程为了方便工作所以我进行对其轻量化编译根本想不到轻量化编译又出现了cxx编译问题这时候我就觉得肯定不是我的工程问题了这纯粹就是网络问题他会自动更新昨天还错怪了我自己毕竟我的react native版本也有一些老了2023年时候创建的工程有一些服务的自动更新可以理解嘛为什么昨天没出问题是个疑点说明还是我们工程的问题。这我也没什么办法不过我尽可能锚定版本吧如果适配新版本会耗费很大力气。这时相对昨天来说简单了不少因为昨天的备份所以我有了样本没问题的样本和错误的样本。这就应该很好搞了不过我先进行断网在没问题的样本中测试一下看看是不是网络原因我们已经确定没问题样本可以编译断网情况下如果不能编译说明这是怪事能编译的话说明就是网络问题锤实了。结果是不能编译依然报cxx编译错误。这是怪事我就在想问题出在哪里呢不太可能是windows系统吧我比较相信系统怎么会管你一个应用里面的包的处理呢也可能是虚拟机问题这问题范围太大了原因就是任何问题因此也回到了这次debug的起点。结果就是任何问题不过我相信系统绝对没问题吧问题只能是出在程序编译过程或者某个不知名的自动化关联修改触发而导致的问题上。或者说编译的过程中就出现问题了或者编译本身就有问题毕竟我们这个工程比较老了。心中一惊突然想到经过上面的推论或者样本本身就被污染了呢万一没问题的样本本身就是有问题的呢这不就精彩了吗但是昨天存档时候就感染不太可能当时编译流程都很好也没问题甚至于我都在手机上面运行了。那么问题只能是先进行轻量编译没问题然后进行完整编译编出问题完整编译导致了轻量编译出现问题那时我恰巧完整编译后没有再验证一次轻量编译能不能通过。毕竟一开始轻量编译过了什么人会再验证一次呢所以整理一下轻量编译没问题全量编译编出轻量编译出现cxx的基础轻量编译爆出cxx编译问题。大概就是这样的逻辑。这时候迎来当头一棒老版本没问题的工程没有联网没有经过完整编译没问题的老版本工程不是因为外部服务器的自动更新断网现在开始没办法经过完整编译了不过是一个小问题不是cxx问题可能和联网有关联网才能支持下来这个老版本的完整编译。连上网老版本成功编译了说明还是得依赖一下联网不过这和cxx编译问题关系应该不大当时我其实已经脑子绕的一片混乱了....这时候我想再确认一下新版本的工程因为之前经历过完整编译现在看看能不能直接编译成功上来用因为不能完整编译对于未来也是坑未来产品怎么发布呢没办法发布了。这次的编译结果依然是失败的爆cxx编译错误这就证明了前面的解决方案换包不行换包根本解决不了这个问题因为老版本的也不行问题只能出在我们的版本太老了已经不怎么支持了所以也只能是升级版本。用最新版本的。因为锚定版本也很难搞要不就是一直断网现在就是啥都有问题只能说明我们的版本太老了新版本肯定没问题吧不太可能新版本也有问题那react native还工作不工作了新版本不好搞整了很长时间来回做我就略过了我换到0.8react native版本并且创建了最基础的官方实例心里想先创建好最新版本后面老工程迁移过来就好了就是迁移可能稍微有点麻烦。谁叫我是owo相簿的开发者呢我根本连想就没有想绝对不可能存在一点点问题晴天霹雳的大雷官方版本最简单的实例最新的版本给所有开发者的案例竟然也出现了cxx编译问题这是面向所有react native框架的问题可能是windows导致的也可能是虚拟机导致的或者空气中的氧元素...好了揣摩cxx原因问题的可能性设想到此为止吧既然新版本也有问题而且我还不熟悉我直接去维护老版本得了还有记录文件存在。以及多年这个版本的开发经验。不过整体说明我们得直面问题了前面我的选择一直都是绕过去我不太想处理编译逻辑一方面我不太擅长另一方面这件事很累我主要属于一个h5系统的工程师如果是h5系的话我比较熟悉我也有把握能够刨根问底刨到最后但涉及到安卓生态以及c生态可能会有点有心无力。第一步先做一个bug问题的最简单的复现拿上最简单的bug复现然后去找react native官方最简单的复现我们是怎么做的呢创建一个工程工程里面只包含几个核心的包带上有问题的react-native-screens然后用npm i 去下载一波就用我的这个框架代码后面框架代码再简化一波。最简化这个工程做下来遇到很多常规bug问题一方面我记不住另一方面没必要说这些常规bug都解决了可以完整编译也可以轻量编译这时候我发现这个新的案例工程好像可以解决cxx问题完整编译了再轻量编译也没有出现cxx编译问题。这不就是我最想要的那个吗这个最简工程可能说明主要问题在于react-native-screens的一个固定版本或者我们家的react-native-screens本身损坏了导致的问题这就犹如一个世界的巨大可能性瞬间缩小到了芝麻大小。不管是版本问题还是损坏问题我们都按从零开始将node_modules文件夹删除了主要原因就是我的node_modules文件夹太老了维护这个文件夹维护了三年多一直没有变动过。可能是什么时候啊安装的某个依赖自动的将react-native-screens文件损坏了或者改变了其版本。没问题的最简化工程版本是react-native-screens30我们当前主工程的版本是react-native-screens31所以我删除node_modules文件夹然后降一下版本就将这个困扰了我两天的bug成功解决了这个bug困扰的我简直身心俱疲。耗费我两天的时间也好在这个bug得到了解决最终感谢一下npm包管理器吧犹如软件工程师我在debug时的得力助手一样npm包管理器帮我挡了一刀最后才竭尽全力解决掉了这个bug。全文写了3500字调试debug日志记录现在也已经结束了我是千里马是一个擅长于上层应用开发的软件工程师我们未来有机会再见。

相关新闻