我正在尝试在Xcode 12(beta 5)中构建一个大型(正在开发Xcode 11!)项目,为iOS 14做准备。代码库以前是Objective-C中的,但现在它同时包含Objective-C和Swift,并使用Objective-C或Swift的pod。

我已经推出了支持Xcode 12的CocoaPods新测试版(目前为1.10.0.beta 2)。

Pod安装成功。当我进行构建时,在pod框架上出现以下错误:

为iOS模拟器构建,但链接到为iOS构建的对象文件中,用于体系结构arm64

以及可能的错误:

无法加载目标“arm64-apple-ios11.0”的标准库

当我在框架上运行lipo-info时,它有:armv7s armv7 i386 x86_64 arm64。

此前,该项目的有效架构设置为:armv7、armv7s和arm64。

在Xcode 12中,根据苹果的文档,该设置将消失。架构设置为$(ARCH_STANDARD)。我在排除的架构中没有任何设置。

这里可能发生了什么?我还没能用一个更简单的项目重现这一点。


当前回答

我了解arm64和Xcode 12的问题,我能够通过排除iPhone模拟器的arm64架构或通过为发布方案设置ONLY_ACTIVE_ARCH来解决构建问题。然而,我仍然有问题使用pod repo推送来推送我的框架。

我发现podspec中的设置s.pod_target_xcconfig不会将此设置应用于同一podspec中定义的依赖项。我可以在Cocoapods在验证期间生成的虚拟App项目中看到它。Cocoapods验证正在运行模拟器的发布方案,当一个或多个依赖项不排除arm64或未设置为仅构建活动体系结构时,这将失败。

解决方案可以是强制Cocoapods在验证项目时添加安装后脚本,或者让它构建调试方案,因为调试方案只是构建活动体系结构。

我最终使用Xcode 11发布了我的pod以通过验证。您可以从developer.apple.com下载Xcode 11,将其作为Xcode11.app复制到Applications文件夹,然后使用sudo Xcode select--switch/Applications/Xcode11/app/Contents/developer进行切换。完成后不要忘记切换回来。

其他回答

在我的案例中:

我有四种配置(+DebugQa和ReleaseQa)。Cocoapods用作依赖关系管理器。

对于DebugQa,我在设备和模拟器上收集数据,而在ReleaseQa上只在设备上收集数据。

它有助于在PodsProject中将BuildActiveArchitecture设置为“yes”。

对我来说,以下设置有效:

生成设置→ 排除的体系结构。

我在“任何iOS模拟器SDK”选项的发布和调试模式中都添加了“arm64”。

建议的答案过时/不正确。

您应该首先尝试更新CocoaPods和库/应用程序的依赖项,如果不起作用,请联系您正在使用的任何依赖项的供应商,看看他们是否正在进行更新,以在M1 Mac上添加对arm64模拟器切片的支持。

这里有很多答案标记为正确,建议您将arm64从支持的体系结构列表中排除。这充其量是一个非常临时的解决方法,最坏的情况是它会将此问题传播给库的其他用户。如果您排除arm64模拟器切片,则会对您在模拟器中开发的应用程序产生性能影响(这反过来会导致您在开发惊人创意时,闪亮的新M1套件的电池时间减少)。

将此添加到我的pod文件的末尾修复了错误:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64 i386"
    end
  end
end

我相信我找到了答案。根据Xcode 12 beta 6发行说明:

“生成设置”编辑器不再包含有效体系结构生成设置(Valid_ARCHS),因此不鼓励使用它。取而代之的是新的“排除体系结构”生成设置(Excluded_ARCHS)。如果项目包含Valid_AARCHS,则该设置将显示在生成设置编辑器的“用户定义”部分中。(15145028)

我能够通过手动编辑项目文件(我无法确定如何使用Xcode从项目文件中删除该项)并删除所有引用VALID_ARCHS的行来解决此问题。之后,我可以很好地为模拟器进行构建。