TL; DR;
对于您的库/应用程序,甚至对于发布模式,将“仅构建活动架构(ONLY_ACTIVE_ARCH
)”设置为“是” 。
在尝试找出问题的根本原因时,我意识到了一些有关Xcode 12的有趣事实。
Xcode 12实际上是Apple Silicon的垫脚石,不幸的是,目前尚不可用。但是,有了该平台,我们将获得基于arm64的macOS,与目前基于Intel的x86_64架构不同,模拟器也将在arm64架构上运行。
Xcode通常依靠“运行目标”来构建其库/应用程序。因此,当一个模拟器被选择为“运行目的地”,它构建可用模拟器架构的应用程序,并当设备被选择为“运行目的地”它建立了架构,该装置支撑件(arm*
)。
xcodebuild
Xcode 12+构建系统中的,被认为arm64
是模拟器的有效架构。所以,当一个模拟器被选为运行目标,它可能尝试编译/链接对你的库/应用arm64
基于模拟器以及(尚未公布)。因此,它发送clang(++)
一些-target标志,如arm64-apple-ios13.0-simulator
<architecture>-<os>-<sdk>-<platform>格式,然后clang尝试针对基于arm64的模拟器构建/链接,该模拟器最终在基于Intel的mac上失败。
但这xcodebuild
仅适用于Release版本。为什么?因为“仅构建活动体系结构(ONLY_ACTIVE_ARCH
)”构建设置通常仅对“发布”配置设置为“否”。这意味着xcodebuild
将尝试为发布构建的选定运行目标构建libs / apps的所有体系结构变体。而对于模拟器中运行的目标,它将包括x86_64
和arm64
现在,因为arm64
在Xcode 12+也是模拟器支持的架构,以支持苹果硅。
简而言之,Xcode在尝试使用命令行xcodebuild
(默认为释放构建,请参见项目设置的常规选项卡)或尝试构建运行目标支持的所有体系结构变体时,均无法构建您的应用程序。因此,解决此问题的简单方法是在您的库/应用程序中将“仅构建Active Architecture(ONLY_ACTIVE_ARCH
)”设置为“是” ,即使对于发布模式也是如此。
如果这些库包含在Pod中,并且您有权访问,则.podspec
可以简单地进行设置:
spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH'=>'是'}
spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH'=>'是'}#不推荐
我个人不喜欢第二行,因为pod不应污染目标项目,并且它可能会在目标设置本身中被覆盖。因此,用某种方式覆盖设置应该是用户项目的责任。但是,这可能对成功吊舱规格很有必要。
但是,如果您无权访问,则.podspec
可以在安装Pod时始终更新设置:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
我担心的一件事是,当我们实际归档libs / apps时,这会产生什么影响。在归档过程中,应用程序通常采用“发布”配置,由于这将仅考虑当前运行目标的活动体系结构来创建发行版本,因此使用此方法,我们可能会丢失目标版本中的armv7,armv7s等片。但是,我注意到文档说(在附图中突出显示),当我们选择“ Generic iOS Device / Any Device”作为运行目标时,此设置将被忽略,因为它没有定义任何特定的体系结构。因此,我想如果我们将应用程序选择为运行目标来存档,那应该会很好。