我正在尝试在 Xcode 12(beta 5)中构建一个大型(并且正在使用 Xcode 11!)项目来为 iOS 14 做准备。代码库以前在 Objective-C 中,但现在它包含 Objective-C 和 Swift,并使用 Objective-C 和/或 Swift 的 pod。
我已经使用 Xcode 12 支持(当前为 1.10.0.beta 2)提取了 CocoaPods 的新测试版。
Pod 安装成功。当我进行构建时,我在 pod 框架上收到以下错误:
为 iOS 模拟器构建,但在为 iOS 构建的目标文件中链接,用于架构 arm64
也可能是错误:
无法为目标“arm64-apple-ios11.0”加载标准库
当我在框架上运行 lipo -info
时,它有:armv7s armv7 i386 x86_64 arm64。
以前,该项目将有效架构设置为:armv7、armv7s 和 arm64。
根据 Apple 的文档,在 Xcode 12 中,该设置消失了。架构设置为 $(ARCHS_STANDARD)。我没有在排除架构中设置任何内容。
这里可能发生了什么?我还不能用一个更简单的项目来重现这个。
arm64
添加到排除的架构(构建设置) (3) 清理构建文件夹 (4) 运行应用程序
基本上,您必须从您的项目和 Pod 项目中排除模拟器架构的 arm64
,
为此,导航到项目的构建设置并在排除架构中添加任何具有 arm64 值的 iOS 模拟器 SDK。
或者
如果您使用自定义 XCConfig 文件,您可以简单地添加此行以排除模拟器架构。 EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 然后你必须对 Pod 项目做同样的事情,直到所有 Cocoa pod 供应商都完成在他们的 Podspec 中添加以下内容。 s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } 您可以在 Pod 中手动添加排除架构项目的构建设置,但是当你使用 pod install 时它会被覆盖。取而代之的是,您可以在 Podfile 中添加此代码段。每次运行 pod install 时,它都会编写必要的构建设置。 post_install 做 |安装程序| installer.pods_project.build_configurations.each 做 |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" end end
TL;博士;
将您的库/应用程序的“仅构建活动架构 (ONLY_ACTIVE_ARCH
)”设置为 Yes,即使对于 release 模式也是如此。
在试图找出问题的根本原因时,我意识到了一些关于 Xcode 12 的有趣事实。
Xcode 12 实际上是 Apple 芯片的垫脚石,不幸的是它还不可用(在写答案时)。但是有了这个平台,我们将获得一个基于 arm64 的 macOS,其中模拟器也将在 arm64 架构上运行,这与目前基于 Intel 的 x86_64 架构不同。 Xcode 通常依赖于“运行目标”来构建它的库/应用程序。因此,当模拟器被选为“运行目标”时,它会为可用的模拟器架构构建应用程序,而当设备被选为“运行目标”时,它会为设备支持的架构 (arm*) 构建应用程序。 xcodebuild,在 Xcode 12+ 构建系统中,将 arm64 视为支持 Apple 芯片的模拟器的有效架构。 So when a simulator is chosen as the run destination, it can potentially try to compile/link your libs/apps against arm64 based simulators, as well.因此它以
简而言之,Xcode 在尝试使用命令行 xcodebuild
(默认为发布构建,请参阅项目设置的常规选项卡)或以其他方式尝试构建所有支持的架构变体时,将无法构建您的应用程序按运行目的地。因此,解决此问题的一个简单方法是在您的库/应用程序中将“仅构建活动架构 (ONLY_ACTIVE_ARCH
)”设置为 Yes,即使对于发布模式也是如此。
https://i.stack.imgur.com/EwcNf.png
https://i.stack.imgur.com/ryqPU.png
如果库作为 Pod 包含并且您有权访问 .podspec
,您可以简单地设置:
spec.pod_target_xcconfig = { 'ONLY_ACTIVE_ARCH' => 'YES' }
spec.user_target_xcconfig = { 'ONLY_ACTIVE_ARCH' => 'YES' } # 不推荐
我个人不喜欢 pods shouldn't pollute the target project 之后的第二行,它本身可以在目标设置中被覆盖。因此,消费者项目应该有责任通过某种方式覆盖该设置。但是,这可能是成功 linting podspec 所必需的。
但是,如果您无权访问 .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
我担心的一件事是,当我们实际归档库和应用程序时,这会产生什么影响。在归档应用程序期间,通常采用“发布”配置,因为这将创建一个发布版本,只考虑当前运行目标的活动架构,使用这种方法,我们可能会从目标版本中丢失 armv7、armv7s 等的切片.但是,我注意到文档说(在附图中突出显示)当我们选择“通用 iOS 设备/任何设备”作为运行目标时,该设置将被忽略,因为它没有定义任何特定的架构。所以我想如果我们存档我们的应用程序选择它作为运行目的地,我们应该会很好。
user_target_xcconfig
并且值不完全匹配,CocoaPods 将发出类似这样的警告 [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.
podspec 语法参考说这个属性是“不推荐的”guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig。所以请不要使用 user_target_xcconfig
来为许多开发者省去麻烦。
我找到了解决办法! SwiftUI Previews not working with Firebase
如果您将模拟器的排除架构设置为 arm64,它将编译。
https://i.stack.imgur.com/tISvF.png
建议的答案已过时/不正确。
您应该首先尝试更新 CocoaPods 和您的库/应用程序的依赖项,然后,如果这不起作用,请联系您正在使用的任何依赖项的供应商,看看他们是否有正在进行更新以在 M1 Mac 上添加对 arm64 模拟器切片的支持。
这里有很多标记为正确的答案,建议您应该从支持的架构列表中排除 arm64。这充其量是一个非常临时的解决方法,最坏的情况是它会将这个问题传播给您图书馆的其他消费者。如果您排除 arm64 Simulator 切片,则会对您在模拟器中开发的应用程序产生性能影响(这反过来会导致在您开发惊人创意时减少闪亮的新 M1 套件的电池使用时间)。
Xcode 12 中删除了 Valid Architectures 构建设置。如果您在此构建设置中有值,它们会导致问题并需要删除。
我能够通过将 VALID_ARCHS 构建设置重新添加为用户定义的构建设置(没有值)、运行项目(失败),然后删除 VALID_ARCHS 构建设置来“清除”它。之后,我就可以在模拟器上运行了。
我的架构构建设置是标准架构。
您可以从 Build Settings 中的加号按钮添加用户定义的设置:
https://i.stack.imgur.com/h9hUk.png
Xcode 12.3
我通过将验证工作区设置为是解决了这个问题
https://i.stack.imgur.com/QcYW4.png
所有这些答案中的隐藏宝石
https://i.stack.imgur.com/SEYAV.png
轻松修复
右键单击 Applications 文件夹中的 xcode 获取信息 选择“使用 Rosetta 打开”
跑。
在尝试和搜索了不同的解决方案之后,我认为最安全的方法是在 Podfile 的末尾添加以下代码
post_install do |pi|
pi.pods_project.targets.each do |t|
t.build_configurations.each do |bc|
bc.build_settings['ARCHS[sdk=iphonesimulator*]'] = `uname -m`
end
end
end
这样,您只需将 iOS 模拟器的编译器架构覆盖为当前 cpu 的架构。与其他解决方案相比,此解决方案也适用于配备 Apple Silicon 的计算机。
对我来说,以下设置有效:
构建设置 → 排除的架构。
我在“任何 iOS 模拟器 SDK”选项的发布和调试模式中添加了“arm64”。
https://i.stack.imgur.com/7Oe6S.png
转到目标部分,选择每个目标并执行以下操作:
将 Build Active Architecture Only 设置为 YES
添加排除架构并将其值设置为 arm64(见附件)
将活动方案(在项目名称旁边的工具栏上)设置为任何 iOS 模拟器
从产品菜单中清理构建文件夹并构建。
https://i.stack.imgur.com/HRVFd.jpg
我找到
使用 Rosetta(在 Finder 中查找 Xcode > 获取信息 > 使用 Rosetta 打开)构建活动架构仅在项目和目标中将所有内容设置为 YES(您可能不需要它,请阅读下面的评论)并将其包含在 podfile 中:
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
为我工作。
我们同时拥有 Pod 和 SPM,但它们不能与其他答案的任何组合一起使用。我的同事都使用英特尔 MacBook,而且一切都对他们有用!
M1 Mac
上并且也在使用 CocoaPods and SPM
。我认为以上所有答案仅用于修复 CocoaPods,但不解决 SPM 的问题。你是对的,我实际上并不需要你的第 3 步,只需要前 2 步就可以了!谢谢!
我通过在“Excluded Architectures”中为项目目标和 pod 目标添加“arm64”解决了这个问题。
Xcode → 目标项目 → 构建设置 → 排除架构 → *"arm64"
Xcode → Pod Target → Build Setting → Excluded Architectures → *"arm64"
如果您在 Xcode 12 中使用模拟器而不是真实设备遇到问题,是的,您必须删除 VALID_ARCHS 设置,因为它不再受支持。转到“构建设置”,搜索“VALID_ARCHS”,然后删除用户定义的属性。在你拥有的每一个目标中都这样做。
不过,您可能需要在 podfile 的底部添加一个脚本,以使 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
VALID_ARCHS
效果很好。我没有对 podfile 和 pods 项目进行任何更改。
升级到 Xcode 12 后,我仍然可以为真实设备构建,但不能为模拟器构建。 Podfile 构建仅适用于真实设备。
我在 Build Settings > User-Defined 下删除了 VALID_ARCHS,它起作用了!在找到这个之前敲了我的头一段时间。
1.将arm64
添加到Build settings
-> Exclude Architecture
在所有目标中。
https://i.stack.imgur.com/8RYFH.png
2.关闭Xcode并按照以下步骤打开
在 Finder 中右键单击 Xcode Get Info Open with Rosetta
Xcode 版本 13.2.1 和 macOS Monterey 12.0.1
在切换到新的 M1 芯片系统后,几乎每个人都面临与旧项目和 Pod 相同的问题。
“在 /Users//Desktop/_iOS_app/Pods/iOS/framework/(CLSInternalReport.o) 中,为 iOS 模拟器构建,但在为 iOS 构建的目标文件中链接,文件 '/Users/y/Desktop/_iOS_app/Pods/iOS /.framework/用于架构 arm64"
我已经找到了一个完美运行的解决方案。
首先,对于所有建议为您的项目排除 arm64 的开发人员将工作是的,它会编译,但安装后当您尝试打开它时,它会显示一个弹出消息,“此应用程序的开发人员需要更新它以使用此版本的 iOS”。这是因为根据苹果“在 iOS 11 及更高版本中,所有应用程序都使用 64 位架构”,如果您为项目排除 arm64,它将不会在 iOS 11 及更高版本上打开 App。
https://i.stack.imgur.com/nBDBS.jpg
因此,与其选择整个项目,不如仅将模拟器的架构排除在 arm64 上。
步骤:在项目文件之上,选择目标 > 构建设置 > 架构 > 排除架构。现在添加选择“任何 iOS 模拟器 SDK”并给它一个值 arm64。
参考下图。
https://i.stack.imgur.com/2C1qf.png
Xcode 12
从 User-Defined 组下的 Build settings 中删除 VALID_ARCH
为我工作。
https://i.stack.imgur.com/y4Yog.png
我在从命令行构建框架时遇到问题。我的框架依赖于其他缺少对基于 ARM 的模拟器的支持的框架。在升级依赖项之前,我最终排除了对基于 ARM 的模拟器的支持。
从命令行构建模拟器框架时,我需要 EXCLUDED_ARCHS=arm64
标志。
xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64
-destination "generic/platform=iOS Simulator"
为通用目标构建。这导致构建所有可用架构,包括自 Xcode 12 以来的 arm64。
我相信我找到了答案。根据 Xcode 12 beta 6 发行说明:
“构建设置编辑器不再包含有效架构构建设置 (VALID_ARCHS),并且不鼓励使用。相反,有一个新的排除架构构建设置 (EXCLUDED_ARCHS)。如果项目包含 VALID_ARCHS,则该设置显示在用户- 构建设置编辑器的定义部分。(15145028)"
我能够通过手动编辑项目文件(我无法弄清楚如何使用 Xcode 从项目文件中删除项目)并删除所有引用 VALID_ARCHS 的行来解决此问题。之后,我就可以为模拟器构建了。
在尝试了该问题的几乎所有答案并阅读了 Apple 开发者论坛之后,我发现只有一种解决方案对我有用。
我正在构建一个在 Swift 应用程序中使用的通用框架。我无法在没有架构错误的情况下构建到模拟器。
在我的框架项目中,我的构建阶段有一个通用框架任务。如果您遇到这种情况:
在构建阶段将以下内容添加到您的 xcodebuild 任务中:EXCLUDED_ARCHS="arm64"
接下来,您必须更改以下项目构建设置:
删除 VALID_ARCHS 用户定义设置
将 ONLY_ACTIVE_ARCH 设置为 YES ***
*** 如果您正在开发框架并有演示应用程序,则必须在两个项目中打开此设置。
我遇到了同样的问题并尝试在 M1 Mac 上启动 React Native 应用程序。请注意,我使用相同项目的 Intel Mac 运行良好,没有出现此错误。
为我解决问题的是强制 Xcode 通过 Rosetta 打开。
为达到这个:
右键单击 Applications 文件夹中的 Xcode* → 获取信息 → 选中“使用 Rosetta 打开”复选框。
对于通过 carthage 安装的特定库,我也遇到了同样的问题。对于使用 Carthage 的用户,由于 Carthage 无法在 Xcode 12 中开箱即用,本文档将指导您完成适用于大多数情况的解决方法。好吧,很快,Carthage 构建了胖框架,这意味着该框架包含所有受支持架构的二进制文件。在 Apple Silicon 推出之前,一切都运行良好,但现在出现了冲突,因为存在重复的架构(用于设备的 arm64 和用于模拟器的 arm64)。这意味着 Carthage 无法将特定于架构的框架链接到单个胖框架。
您可以按照此处的说明进行操作。 Carthage XCODE 12
https://i.stack.imgur.com/3aozP.png
尝试使用模拟器运行您的项目。模拟器应该运行没有任何错误。
请不要忘记在将 arm64 添加到排除架构后清理构建文件夹。
在您的 xxx.framework podspec 文件中,添加以下配置。避免使用包含 arm64 模拟器架构的 pod 包。
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
user_target_xcconfig
并且值不完全匹配,CocoaPods 将发出类似这样的警告 [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values.
podspec 语法参考说这个属性是“不推荐的”guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig。所以请不要使用 user_target_xcconfig
来为许多开发者省去麻烦。
Xcode 13.2.1,Monterey,目标 iOS 14.0,cocoapod 1.11.2
在包含 LogRocket
和/或 Plaid
时,我遇到了类似的问题——它们是 xcframework
,在我的本地上运行良好,但不能在 bitrise 上构建,我已经尝试了上面的所有答案:
EXCLUDED_ARCHS arm64
在 Podfile 中将 ONLY_ACTIVE_ARCH 设置为 YES
VALIDATE_WORKSPACE 为 YES
在 Podfile 中将 ARCHS[sdk=iphonesimulator*] 设置为 uname -m
它们都不起作用
但是通过指定目标iOS版本或删除它会起作用:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
# OR
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
end
end
end
转到查找器->应用程序-> Xcode->右键单击Xcode->选择使用rosetta打开
https://i.stack.imgur.com/Zd4se.png
更新:2020 年 10 月
您可以在 Excluded Architecture 下为 Debug > Simulator - iOS 14.O SDK
简单地设置 arm64
。
https://i.stack.imgur.com/w9iig.png
arm64
,它将尝试使用 Rosetta 构建和运行
这里的问题是 Xcode 11 中的有效架构。在 Xcode 11 中打开项目并将您的项目、目标和 Pod 的 Valid architectures 值更改为 $(ARCHS_STANDARD)
。在 Xcode 12 中重新打开项目并构建。
编译模拟器时的问题:
为 iOS 模拟器构建,但在为 iOS 构建的对象文件中链接,用于架构 arm64
Xcode 12.1, Pod 1.9.1
我的项目结构
主要目标
分享扩展
通知服务扩展
子模块,自定义框架
播客文件
将 arm64 添加到 Build settings -> Exclude Architecture in all the targets。从 VALID_ARCHS 中删除 arm64 并在所有目标中添加 x86_64。在 podfile 中添加以下代码 post_install do |installer| installer.pods_project.build_configurations.each 做 |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" end end 是否更新了 pod,删除了 podfile.lock,并做了 pod install 进行了干净的构建。
EXCLUDED_ARCHS
之后没有[sdk=iphonesimulator*]
,XCode 在为实际设备构建时将无法找到您的 pod,因为不会为 arm64 构建任何 pod。post_install do |installer|
部分。将内部部分installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" end
粘贴到flipper_post_install(installer)
行后面。building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64
。如何解决?