xcode - 对于非常大的应用程序,如何修复因“ARM64 分支超出范围”而失败的构建?
问题描述
我们无法在优化级别设置为“无”的 Xcode 中构建我们的 iOS 应用程序:
Xcode 在链接器阶段给出错误:
ld: b(l) ARM64 branch out of range (138312952 max is +/-128MB): from _main (0x100006F10) to __Unwind_Resume@0x00000000 (0x1083EED14) in '_main' from /Users/user/Library/Developer/Xcode/DerivedData/OurApp-banhncbunovfpngtiwyxnvvokvnc/Build/Intermediates.noindex/OurApp.build/ReleaseForRunning-iphoneos/OurApp.build/Objects-normal/arm64/main.o
我们认为这是因为我们的二进制文件太大了。
我们可以将优化级别设置为最快、最小:
但是我们不能在断点处调试和停止——它们被这个优化级别打破了。
使用“最快、最小”,我们的二进制文件大小约为 660 MB。
我们认为“无”优化级别二进制大小超过了一些 clang/ld 限制,这导致
ARM64 branch out of range
错误。
我们现在不能轻易地从我们的项目中删除大量代码。即使我们这样做了,我们的代码库也会增长得非常快。
所以即使我们现在删除一些代码,问题很快就会再次出现。
我们试图在 clang/ld 中寻找一个扩大最大文件大小的选项,但找不到它。
我们还发现我们的临时构建版本的二进制文件大小要小得多——大约 230 MB。
我们认为这与 Xcode 用于调试构建的调试信息有关。
有没有办法再次在 Xcode 中进行调试构建?
可能是 Xcode/clang/ld 中的某些设置会更改二进制文件大小限制。
或者也许是另一种(更紧凑的)调试信息格式,以使我们的调试二进制文件更小。
更新 1:
我们发现,当将 Build Active Architecture Only 设置为 YES 时,我们可以在非 64 位设备上运行。但是这些设备对我们的应用程序来说非常弱,我们无法调试我们想要的所有功能 - 在我们调试之前设备因内存不足而崩溃。
更新 2:
Xcode 不允许在支持 64 位的设备上运行仅 armv7 的应用程序。如果有人知道在 64 位设备上运行 armv7-only 构建的方法,请分享。这样的解决方案将适合我们 - 我们将构建 armv7-only 构建,它比 armv7+arm64 构建小得多。
解决方案
推荐阅读
- leaflet - 如何更改 mapbox 传单中的语言?
- java - 如何在不使用 android 中任何类型的对话框或模型的情况下创建日期选择器
- react-native - React Native - 在抽屉导航中的不同堆栈之间导航
- javascript - Rails 6 + Webpack document.addEventListener 不工作
- bootstrap-4 - 在引导程序上形成两列
- apache-kafka - 缺少嵌入式KafkaCluster?
- java - OffsetDateTime jsonFormat 允许两种类型的模式
- python - 如何将信息从熊猫数据框列映射到一些可视化?
- python - 有人可以告诉我为什么这是错误的吗?
- javascript - chart.js 显示两个日期之间的均匀间隔并将标签添加到 y 轴