ChatGPT解决这个技术问题 Extra ChatGPT

为 iOS 模拟器构建 Xcode,但在为 iOS 构建的对象文件中链接,用于架构“arm64”

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

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

我有一个 Apple Silicon M1,但仍然遇到这个 arm64 错误。为什么会这样?
同样在这里,Apple M1,刚刚开始发生。我能找到的解决方案似乎都不起作用..任何人都知道吗?为 iOS 模拟器构建,但在为 iOS 构建的目标文件中链接,文件 '/................/Pods/GoogleMaps/Maps/Frameworks/GoogleMapsCore.framework/GoogleMapsCore' 用于架构 arm64
TLDR; XCode 13 + Apple M1:(1) 使用 Rosetta 打开 Xcode(应用程序 -> 右键单击 Xcode -> 获取信息 -> 检查 Open with Rosetta)。 (2) 将 arm64 添加到排除的架构(构建设置) (3) 清理构建文件夹 (4) 运行应用程序

P
Peter Mortensen

基本上,您必须从您的项目和 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


这里关于 CocoaPods 的额外细节很好。请注意,如果在 EXCLUDED_ARCHS 之后没有 [sdk=iphonesimulator*],XCode 在为实际设备构建时将无法找到您的 pod,因为不会为 arm64 构建任何 pod。
为我工作!请注意,由于 Flipper,大多数 Podfile 中已经有一个 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。如何解决?
这个解决方案非常好,我要补充一点,如果您正在构建自己的 pod,请特别注意作者在“......直到所有可可豆供应商都完成添加他们的 Podspec”之后建议的 2 行,因为没有这些当我尝试将其推送到我的私人仓库时,在我自己的框架的 Podspec 中导致 linting 失败。谢谢!
这有时会起作用,但实际上是错误的和损坏的。模拟器上 arm64 的 EXCLUDED_ARCHS 意味着使用 Apple Silicon mac 的人将无法使用您的框架。实际对我有用的修复是按照 stackoverflow.com/a/63714000/234 清除 VALID_ARCHS
P
Peter Mortensen

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.因此它以 --- 格式发送 clang(++) 一些 -target 标志,例如 arm64-apple-ios13.0-simulator,并且 clang 尝试构建/链接 arm64-基于模拟器,最终在基于 Intel 的 Mac 上失败。但是 xcodebuild 仅针对 Release 构建尝试此操作。为什么?因为,“仅构建活动架构 (ONLY_ACTIVE_ARCH)”构建设置通常仅针对“发布”配置设置为“否”。这意味着 xcodebuild 将尝试为发布构建的选定运行目标构建库/应用程序的所有架构变体。对于模拟器运行目标,它现在将包括 x86_64 和 arm64,因为 Xcode 12+ 中的 arm64 也是模拟器支持 Apple 芯片的受支持架构。

简而言之,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 设备/任何设备”作为运行目标时,该设置将被忽略,因为它没有定义任何特定的架构。所以我想如果我们存档我们的应用程序选择它作为运行目的地,我们应该会很好。


这确实是来自 Apple 的一个令人惊讶的变化,我花了半天时间才弄清楚我觉得 Apple 应该补偿 :)。这不是一个记录在案的更新(至少据我所知),并且肯定会影响升级到 Xcode 12 的每个人。我只希望每个人在了解基础知识后都能找到自己的方法来克服它。
如果多个 pod 规范使用 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 来为许多开发者省去麻烦。
正确的!我想我已经在回答中提到了这一点。
我设法让这一切最终使用 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' 但仅在 pod_target_xcconfig 中,并且仅在问题 pod(其中包括预建库)和依赖于的单个 pod 上问题吊舱。其他一切都保持干净。我决定我更喜欢主动拱解决方案。
在 Apple Silicon 上,这样做会导致另一个错误。这可能是由于某些特定的 pod。我为这些案例打开了一个特定的问题。 stackoverflow.com/questions/65364886/…
P
Peter Mortensen

我找到了解决办法! SwiftUI Previews not working with Firebase

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

https://i.stack.imgur.com/tISvF.png


很公平,我遇到的问题是手动链接库,但它并没有导致我们正在使用的 Pod 出现问题。
我正在测试发布模式,所以我也必须将它添加到发布
我想我们在这篇文章之后又回到了这个行业。谢谢它帮助。
这对我有用,但只有当我为 arm64 构建时;模拟器不工作。小吐槽:xCode 太荒谬了,12.5 个演出,大量的豆荚。与这种体验相比,Building for Android 就像在公园里散步一样。
这不适用于 M1 mac
P
Peter Mortensen

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

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

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


这是真的,因为排除或包含架构的修改仅适用于基于 i386 的机器。
告诉 GOOGLE……他们仍然不支持 SPM。这将是几年。
这个答案应该是正确接受的答案。 @BeauNouvelle Google 最近开源了很多他们的 SDK(比如 GoogleSignIn),现在支持带有 arm64 模拟器切片的 xcframework;)
我同意,这是正确的答案,但是,有时您必须处理遗留问题。在英特尔上,我不得不接受@AyanSengupta 的回答才能测试我的调试版本。
这是正确的,但不幸的是,仍然没有为未维护的项目提供可行的替代方案😅
P
Peter Mortensen

Xcode 12 中删除了 Valid Architectures 构建设置。如果您在此构建设置中有值,它们会导致问题并需要删除。

我能够通过将 VALID_ARCHS 构建设置重新添加为用户定义的构建设置(没有值)、运行项目(失败),然后删除 VALID_ARCHS 构建设置来“清除”它。之后,我就可以在模拟器上运行了。

我的架构构建设置是标准架构。

您可以从 Build Settings 中的加号按钮添加用户定义的设置:

https://i.stack.imgur.com/h9hUk.png


这应该是公认的答案。确保选择应用项目而不是目标。否则,您将无法从构建设置中删除 VALID_ARCHS。 :)
@trishcode即使在这样做之后我也遇到了同样的错误(xcode12 beta4),任何解决方法
@SivakrishnaPerla 如果您可以在 Xcode 11 中打开项目,那么您可以准确地看到 Valid Architectures 用于哪些目标。您甚至可以清除 Xcode 11 中的设置,然后在 Xcode 12 中再次尝试该项目。如果您仍然需要解决方法并且在嵌入式框架上遇到错误,那么 SlashDevSlashGnoll 的答案应该可以工作。如果您需要解决方法并且在 Cocoapod 上遇到错误,请在安装后的 Podfile 中排除 arm64 架构。
@trishcode 谢谢,在排除架构中设置 arm64 并删除 VALID_ARCHS 有效。
如果我删除 VALID_ARCHS 并将 arm64 添加到排除的架构,我会收到此错误 - 检查依赖项没有要编译的架构 (ARCHS=arm64 x86_64, VALID_ARCHS=, EXCLUDED_ARCHS=( arm64 ))。
R
RunesReader

Xcode 12.3

我通过将验证工作区设置为是解决了这个问题

https://i.stack.imgur.com/QcYW4.png


解决了我的问题。最简单的修复!我很高兴这已解决,但有人可以解释这是如何解决问题的吗?
我遇到了 UI 测试和 KIF 库的问题(这是一个使用 KIF 的 Xcode 单元测试)。我尝试了所有其他解决方案,但在我为那些单元测试启用“验证工作区”之前没有任何效果。谢谢!
这是唯一对我有用的解决方案,但是它确实在调试器中保留了“目标完整性”警告。
在过去几天尝试了所有其他解决方案但没有成功之后,这个解决方案在我的 Xcode 12.2 上为我工作。
它应该做什么?为什么它有效?最好是update your answer。 (但没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的。)
T
Tomas Ward

所有这些答案中的隐藏宝石

https://i.stack.imgur.com/SEYAV.png


这会影响某些设备的内置生产吗?
@MohamedAbdou arm64 用于物理设备,所以我认为在真正的 iPhone 上模拟它时可能会发生冲突。无论哪种方式,您都可以按原样尝试,并且在任何情况下,您都可以将 arm64 作为排除架构删除。对于实际生产和发布,我建议您在物理和虚拟设备上成功模拟并使用这些设置进行发布。
也不是完美的答案,现在您的项目无法在 M1 和模拟器上编译,因为所有 pod 都被排除在外
请记住为项目而不是目标设置排除拱门,以便所有目标都继承排除拱门设置
8
8HP8

轻松修复

右键单击 Applications 文件夹中的 xcode 获取信息 选择“使用 Rosetta 打开”

跑。

Xcode get info


这对我来说已经足够了!当我们迁移到 M1 mac 时,带有许多插件(包括 Firebase)的 Cordova 项目开始出现此错误。
这是在 Apple M1 处理器上对我有用的唯一答案。
这是在 M1 和 xCode 13 上对我有用的唯一答案。建议的其他选项甚至在 xCode 13 中都不存在。
不好,现在你在 Rosetta 模拟器上运行 Xcode,这意味着你的东西运行缓慢
C
Camsoft

在尝试和搜索了不同的解决方案之后,我认为最安全的方法是在 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 模拟器的 Apple Silicon 支持。
对于 Apple Silicon,它是唯一有效的
P
Peter Mortensen

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

构建设置 → 排除的架构。

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

https://i.stack.imgur.com/7Oe6S.png


这解决了我的错误问题:找不到框架 Pods_OneSignalNotificationServiceExtension。在模拟器上工作,但不在设备上。谢谢!
它对我有帮助,谢谢!
p
programmer

转到目标部分,选择每个目标并执行以下操作:

将 Build Active Architecture Only 设置为 YES

添加排除架构并将其值设置为 arm64(见附件)

将活动方案(在项目名称旁边的工具栏上)设置为任何 iOS 模拟器

从产品菜单中清理构建文件夹并构建。

https://i.stack.imgur.com/HRVFd.jpg


“构建主动架构”不应该是“仅构建主动架构”吗?
@PeterMortensen 是的,你是对的。解决了这个问题。
排除 arm64 与 Facebook SDK 冲突。它需要 arm64,如果排除 arm64,它会显示“找不到目标 'x86_64-apple-ios-simulator' 的模块 'FBSDKCoreKit';找到:arm64,arm64-apple-ios-simulator”
架构在大多数目标中不可见。这是为什么?
B
Bosco Domingo

我找到

使用 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,而且一切都对他们有用!


podfile 代码可能不是必需的。我发现我不再需要它,因为它的缺失会使 Xcode 无法构建。到今天为止,它不再在 podfile 中,一切仍然有效,仅供参考。对于 Project 和 Target,“仅构建到 Active Arch”仍然设置为 yes(对于我的 Dev 构建,因为这就是我所做的一切,因为我不负责发布,但我怀疑将它用于发布构建也会破坏很多)
OMG,经过 4 小时的挖掘,您的回答解决了我的问题!我在 M1 Mac 上并且也在使用 CocoaPods and SPM。我认为以上所有答案仅用于修复 CocoaPods,但不解决 SPM 的问题。你是对的,我实际上并不需要你的第 3 步,只需要前 2 步就可以了!谢谢!
P
Peter Mortensen

我通过在“Excluded Architectures”中为项目目标和 pod 目标添加“arm64”解决了这个问题。

Xcode → 目标项目 → 构建设置 → 排除架构 → *"arm64"

Xcode → Pod Target → Build Setting → Excluded Architectures → *"arm64"


P
Peter Mortensen

如果您在 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 项目进行任何更改。
谢谢@ÁngelTéllez 也为我工作。节省了我的时间
那么iphone设备的任何解决方案?
N
Navigator

升级到 Xcode 12 后,我仍然可以为真实设备构建,但不能为模拟器构建。 Podfile 构建仅适用于真实设备。

我在 Build Settings > User-Defined 下删除了 VALID_ARCHS,它起作用了!在找到这个之前敲了我的头一段时间。


M
Martin Brisiak

1.将arm64添加到Build settings -> Exclude Architecture 在所有目标中。

https://i.stack.imgur.com/8RYFH.png

2.关闭Xcode并按照以下步骤打开

在 Finder 中右键单击 Xcode Get Info Open with Rosetta


这对我有用。这很可怕,但它奏效了。
工作,谢谢,用罗塞塔打开是关键
a
azeem usmani

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


这个对我有用
P
Pratik Sodha

Xcode 12

User-Defined 组下的 Build settings 中删除 VALID_ARCH 为我工作。

https://i.stack.imgur.com/y4Yog.png


删除?你的意思是把它的价值变成空的东西吗?
是的,从构建设置中删除它。它对我有用。
终于搞定了,谢谢我从 project.pbxproj 文件中删除。
P
Peter Mortensen

我在从命令行构建框架时遇到问题。我的框架依赖于其他缺少对基于 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。
b
btxios

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

“构建设置编辑器不再包含有效架构构建设置 (VALID_ARCHS),并且不鼓励使用。相反,有一个新的排除架构构建设置 (EXCLUDED_ARCHS)。如果项目包含 VALID_ARCHS,则该设置显示在用户- 构建设置编辑器的定义部分。(15145028)"

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


使用 Xcode,VALID_ARCHS 在选择项目(不是目标)中,然后是`Build Setting -> User-Defined"。选择它并删除它。
这个解决方案对我有用。其他一些人建议的解决方案不起作用,因为只是将值“arm64”添加到“排除体系结构”字段开始为生成的 .app 文件提供一些“文件权限”错误。
感谢@btxios 和 Akshay。工作就像一个魅力,它的派对时间
P
Peter Mortensen

在尝试了该问题的几乎所有答案并阅读了 Apple 开发者论坛之后,我发现只有一种解决方案对我有用。

我正在构建一个在 Swift 应用程序中使用的通用框架。我无法在没有架构错误的情况下构建到模拟器。

在我的框架项目中,我的构建阶段有一个通用框架任务。如果您遇到这种情况:

在构建阶段将以下内容添加到您的 xcodebuild 任务中:EXCLUDED_ARCHS="arm64"

接下来,您必须更改以下项目构建设置:

删除 VALID_ARCHS 用户定义设置

将 ONLY_ACTIVE_ARCH 设置为 YES ***

*** 如果您正在开发框架并有演示应用程序,则必须在两个项目中打开此设置。


P
Peter Mortensen

我遇到了同样的问题并尝试在 M1 Mac 上启动 React Native 应用程序。请注意,我使用相同项目的 Intel Mac 运行良好,没有出现此错误。

为我解决问题的是强制 Xcode 通过 Rosetta 打开。

为达到这个:

右键单击 Applications 文件夹中的 Xcode* → 获取信息 → 选中“使用 Rosetta 打开”复选框。


这对我有用
复制到 8HP8 答案
v
vidalbenjoe

对于通过 carthage 安装的特定库,我也遇到了同样的问题。对于使用 Carthage 的用户,由于 Carthage 无法在 Xcode 12 中开箱即用,本文档将指导您完成适用于大多数情况的解决方法。好吧,很快,Carthage 构建了胖框架,这意味着该框架包含所有受支持架构的二进制文件。在 Apple Silicon 推出之前,一切都运行良好,但现在出现了冲突,因为存在重复的架构(用于设备的 arm64 和用于模拟器的 arm64)。这意味着 Carthage 无法将特定于架构的框架链接到单个胖框架。

您可以按照此处的说明进行操作。 Carthage XCODE 12

https://i.stack.imgur.com/3aozP.png

尝试使用模拟器运行您的项目。模拟器应该运行没有任何错误。


Y
YazanGhafir

请不要忘记在将 arm64 添加到排除架构后清理构建文件夹。


如何?通过一些菜单命令?通过手动删除文件或文件夹?你能详细说明吗?请通过 editing (changing) your answer 回复,而不是在评论中(没有“编辑:”、“更新:”或类似内容 - 答案应该看起来好像是今天写的)。
P
Peter Mortensen

在您的 xxx.framework podspec 文件中,添加以下配置。避免使用包含 arm64 模拟器架构的 pod 包。

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

有效!然而,这是否意味着 Pod 不能用于基于 Apple Silicon 的 Mac?
是否已确认@tomacco?
@FernandoReynoso 我刚刚收到了一个开发者转换工具包,(ARM MacMini)将在今天晚些时候进行测试和报告
@tomacco 你能测试一下吗?
如果多个 pod 规范使用 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 来为许多开发者省去麻烦。
r
rexsheng

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

你知道除了 SPM,我们怎么能做同样的事情?
H
Hassan

转到查找器->应用程序-> Xcode->右键单击Xcode->选择使用rosetta打开

https://i.stack.imgur.com/Zd4se.png


虽然这将允许您构建您的项目,但绝对不建议这样做。您将在 x86 模拟环境中运行 Xcode。这可能会慢得多,并且不会利用您的 M1 处理器。
S
Sunil Targe

更新:2020 年 10 月

您可以在 Excluded Architecture 下为 Debug > Simulator - iOS 14.O SDK 简单地设置 arm64

https://i.stack.imgur.com/w9iig.png


你确定吗?这是否意味着它实际上不会在装有 Apple Silicon 的机器上运行?
在 Apple Silicon 上,如果排除 arm64,它将尝试使用 Rosetta 构建和运行
P
Peter Mortensen

这里的问题是 Xcode 11 中的有效架构。在 Xcode 11 中打开项目并将您的项目、目标和 Pod 的 Valid architectures 值更改为 $(ARCHS_STANDARD)。在 Xcode 12 中重新打开项目并构建。


谢谢你提到豆荚!就我而言,我必须从 Pods 项目中排除 arm64 架构才能使其正常工作,但感谢您的提示🙏
P
Peter Mortensen

编译模拟器时的问题:

为 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 进行了干净的构建。


什么是“豆荚”? CocoaPods
是 Pod 的意思是 Cocoapods