我正在尝试在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)。我在排除的架构中没有任何设置。

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


当前回答

这是唯一对我有用的东西:

将此添加到调试(非发布)版本:

// Speed up non-production builds by building only for the currently selected architecture
ONLY_ACTIVE_ARCH = YES

// For unknown reasons we need this to be able to compile for simulators in Apple Silicon macOS without Rosetta
VALID_ARCHS = arm64 armv7 arm64-ios-simulator

并删除所有配置(调试和发布)的EXCLUDED_ARCHS设置的所有自定义实例,包括臭名昭著的EXCLUDE D_ARCHS[sdk=iphonesimulator*]=arm64 one。

这些是我在进行这些更改后进行的测试,所有测试都通过了,在原生Apple Silicon上(Xcode没有Rosetta模式):

Debug Staging Release
Build & Run on Device
Build & Run on Simulator
Archive
Validated against App Store Connect N/A N/A

其他回答

在我的案例中,更新CocoaPods有助于:

卸载CocoaPods(如果已安装):sudogem卸载cocoapods安装CocoaPods:酿造装置椰子如果出现链接错误:brew链接--覆盖cocoapods`运行pod安装

将“仅构建活动体系结构”(Only_Active_ARCH)构建设置设置为yes,xcode要求arm64,因为Silicon MAC体系结构是arm64。

arm64已被添加为Xcode12中的模拟器拱门,以支持Silicon MAC。

/应用程序/Xcode.app/Contents/Developer/Platforms/iPhone模拟器.platform/Developer/SDKs/iPhone模拟器.sdk/SDKSettings.json

排除arm64后,我总是得到ARCHS[@]:未绑定变量。对我来说,唯一的解决方案是将x86_64添加到此处提到的目标构建设置中。升级到Xcode 12:ld:building For iOS Simulator后出现问题,但链接到dylib build For iOS,架构arm64。您也可以删除之前添加的exclude arm64。

我找到了解决方案!SwiftUI预览无法使用Firebase

如果您将模拟器的排除架构设置为arm64,它将编译。

如果您在Xcode 12中遇到模拟器(而不是真实设备)的问题,是的,您必须删除VALID_ARCHS设置,因为它不再受支持。转到“构建设置”,搜索“VALID_ARCHS”,然后删除用户定义的财产。在你拥有的每一个目标中都做到这一点。

不过,您可能需要在pod文件的底部添加一个脚本,以便使用正确的体系结构和部署目标编译pod:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
     end
  end
end