在Xcode 12中创建通用框架时出现Lipo错误

问题描述

xcode 12 中创建通用框架时,我遇到了问题。以下是我运行的命令:-

lipo -create build / simulator / FrameworkName.framework / FrameworkName build / devices / FrameworkName.framework / FrameworkName -output build / universal / FrameworkName.framework / FrameworkName

以下是我面临的错误:-

严重错误:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo:build / simulator / FrameworkName.framework / FrameworkName和build / devices / FrameworkName.framework / FrameworkName具有相同的架构(arm64),并且不能位于相同的胖输出文件

当我搜索错误时,我找到了将“建筑设置”中的“建筑”设置为“标准”的解决方案,但已将其设置为“标准”,请找到所附的屏幕截图

Architectures Screenshot

注意:我正在学习本教程:-https://medium.com/@anuragajwani/how-to-build-universal-ios-frameworks-74b6b07bf31d

解决方法

该错误告诉您 build/simulatorbuild/device 文件夹中的框架都是为相同的架构(arm64,这是一种设备架构)构建的。您可以通过查看 .framework 文件内部来自行验证:FrameworkName.framework/Modules/FrameworkName.swiftmodule。 有可能其中一个(或两个)文件夹包含多个这样的架构: enter image description here

就我个人而言,我喜欢在 Xcode.app 文件夹之外构建我的“胖”框架(只是为了确保我可以完全控制在哪里)。首先,运行模拟器框架(选择任何模拟器作为构建目标)。该过程完成后,转到 Xcode Navigator 中的 Products 文件夹,单击 Show in Finder 文件上的 FrameworkName.framework。将显示的 .framework 复制到更方便的地方(例如 Desktop/simulator 文件夹) enter image description here

然后,再次构建框架,这次只针对设备(选择 Any iOS device 作为构建目标)。将第二个 .framework 复制到 Desktop/iphone 文件夹之类的地方。 为输出框架创建空的 Desktop/universal 文件夹。从 Desktop/iphone 文件夹复制 .framework 文件并删除 Desktop/universal/FrameworkName.framework/Framework 可执行文件。此文件稍后将被 lipo 替换。

接下来,做脂肪魔法:

lipo -create ~/Desktop/iphone/FrameworkName.framework/FrameworkName ~/Desktop/simulator/FrameworkName.framework/FrameworkName -output ~/Desktop/universal/FrameworkName.framework/FrameworkName

最后一步,转到 Desktop/simulator/FrameworkName.framework/Modules/FrameworkName.swiftmodule 复制所有以 x86_64 前缀开头的文件,并将它们粘贴到 Desktop/universal/FrameworkName.framework/Modules/FrameworkName.swiftmodule。现在您的 Desktop/universal/FrameworkName.framework 包含设备和模拟器架构。恭喜,你已经有了你的“胖”图书馆!

免责声明: 是的,我知道有更简单的方法可以使用各种脚本和终端命令来做到这一点,但它们几乎都做同样的事情。一旦您尝试手动一步一步地执行此操作,它将帮助您了解什么去哪里,什么是架构以及如何组合它们。

免责声明 2: 从 Xcode 12 开始,Apple 坚持要求您构建 .xcframeworks 而不是“胖”库。见here