Xcode 12,为 iOS 模拟器构建,但链接为 iOS 构建的目标文件,用于架构 arm64

btx*_*ios 514 xcode ios xcode12 xcode12beta5 xcode12beta6

试图在 Xcode 12 (beta 5) 中构建一个大型(并在 Xcode 11 上工作!)项目以准备 iOS 14。代码库以前是 Obj-C,但现在包含 Obj-C 和 Swift,并使用了Obj-C 和/或 Swift 也是如此。

我已经使用 Xcode 12 支持(目前是 1.10.0.beta 2)拉取了 Cocoapods 的新测试版。

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

为 iOS 模拟器构建,但链接为 iOS 构建的目标文件,用于架构 arm64

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

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

根据 Apple 的文档,在 Xcode 12 中,该设置将消失。Architectures 设置为 $(ARCHS_STANDARD)。我在排除的架构中没有设置任何内容。

任何人都知道这里可能发生什么?我还没有能够用一个更简单的项目来重现这个。

Ami*_*ant 827

基本上你必须arm64从你的项目和 Pod 项目中排除模拟器架构,

  • 要做到这一点,导航到构建设置你的项目,并添加Any iOS Simulator SDK与值arm64Excluded Architecture

    在此处输入图片说明

或者

  • 如果您使用自定义XCConfig文件,您可以简单地添加这一行来排除模拟器架构。
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
Run Code Online (Sandbox Code Playgroud)

然后

你必须对Pod 项目做同样的事情,直到所有可可豆供应商都完成在他们的Podspec 中添加以下内容

EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
Run Code Online (Sandbox Code Playgroud)

您可以Excluded Architechure在 Pod 项目的Build Settings 中手动添加,但是当您使用pod install.

取而代之的是,您可以将此代码段添加到您的Podfile. 每次运行时它都会编写必要的构建设置pod install

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
Run Code Online (Sandbox Code Playgroud)

  • 我收到“为 iOS 模拟器构建,但链接为 macOS、架构 x86_64 构建的对象文件”。如何修复它? (18认同)
  • 为我工作!请注意,由于 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)` 行后面。 (14认同)
  • 这里关于 CocoaPods 的额外细节很好。请注意,如果在“EXCLUDED_ARCHS”之后没有“[sdk=iphonesimulator*]”,XCode 在为实际设备构建时将无法找到您的 pod,因为没有任何 pod 是为 arm64 构建的。 (10认同)
  • 有时这最终会起作用,但实际上是错误的并且被破坏了。模拟器上的 arm64 的 EXCLUDED_ARCHS 意味着拥有 Apple Silicon mac 的人将无法使用您的框架。实际对我有用的修复是按照 /sf/answers/4459980031/ 清除 VALID_ARCHS (7认同)
  • 这不是一个答案 - 这是一个临时的解决方法。您需要联系您的依赖项的供应商,并要求他们提供包含 arm64 Simulator 切片的正确 XCFrameworks。排除 arm64 切片会显着影响 M1 设备上的模拟器性能。 (4认同)
  • 这个解决方案非常好,我想补充一点,如果您正在构建自己的 Pod,请特别注意作者在“...直到所有可可豆荚供应商都完成添加其 Podspec”之后建议的两行,因为缺少这些在我自己的框架中,当我尝试将 Podspec 推送到我的私人存储库时,它导致了 linting 失败。谢谢! (3认同)
  • @WojciechKulik /sf/answers/4489788131/ 这个答案很好地解释了 Xcode 中的更改,我们的模拟器现在在 x86 上运行,但框架也尝试为 arm64 构建。 (3认同)
  • 我想知道既然我们在真实设备上需要arm64,为什么我们在M1上的模拟器中排除arm64?设备和模拟器中的arm64有不同吗? (3认同)
  • 为什么它没有检测到活动架构不是arm64? (2认同)
  • 不幸的是,建议 pod 将这些行添加到其 podspec 中实际上会导致很多问题。在 podspec 中拥有一个带有“user_target_xcconfig”行的单个 pod 将导致应用程序无法为 Apple Silicon Mac 上的模拟器正确构建。而且确实很难追踪,因为当它尝试导入另一个为 arm64(正确)构建的 pod 时,错误就会显现出来,使其看起来像是另一个 pod 的问题。 (2认同)

Aya*_*pta 196

TL; 博士;

将您的库/应用程序的ONLY_ACTIVE_ARCH“仅构建活动架构 ( )”设置为,即使对于发布模式也是如此。


在尝试找出问题的根本原因时,我发现了一些关于 Xcode 12 的有趣事实。

  1. Xcode 12 实际上是 Apple Silicon 的垫脚石,不幸的是它还没有可用(在写答案时)。但是有了这个平台,我们将获得基于 arm64 的 macOS,其中模拟器也将在 arm64 架构上运行,这与目前基于英特尔的 x86_64 架构不同。

  2. Xcode 通常依赖于“运行目标”来构建它的库/应用程序。So when a simulator is chosen as the "Run Destination", it builds the app for available simulator architectures and when a device is chosen as the "Run Destination" it builds for the architecture that the device supports ( arm*).

  3. xcodebuild,在 Xcode 12+ 构建系统中被认为arm64是模拟器支持 Apple Silicon 的有效架构。So when a simulator is chosen as the run destination, it can potentially try to compile/link your libs/apps against arm64based simulators, as well. 所以它发送clang(++)一些 -target 标志,如arm64-apple-ios13.0-simulator<architecture>-<os>-<sdk>-<destination> 格式,并且 clang 尝试构建/链接基于 arm64 的模拟器,最终在基于 Intel 的 mac 上失败。

  4. xcodebuild仅针对发布版本尝试此操作。为什么?因为,“Build Active Architecture Only ( ONLY_ACTIVE_ARCH)”构建设置通常仅针对“Release”配置设置为“No”。这意味着xcodebuild将尝试为发布版本的选定运行目标构建库/应用程序的所有架构变体。对于模拟器运行目标,它将包括现在x86_64arm64现在,因为arm64在 Xcode 12+ 中也是模拟器支持 Apple Silicon的受支持架构

简而言之,Xcode 将无法在任何时候尝试命令行,xcodebuild, (默认为发布构建,请参阅项目设置的常规选项卡)或其他方式构建您的应用程序并尝试构建运行目标支持的所有架构变体。因此,解决此问题的一个简单方法在您的库/应用程序中将“仅构建活动架构 ( ONLY_ACTIVE_ARCH)”设置为,即使对于发布模式也是如此。

在此处输入图片说明 在此处输入图片说明

如果库作为 Pod 包含并且您可以访问,.podspec则只需设置:

spec.pod_target_xcconfig = { 'ONLY_ACTIVE_ARCH' => 'YES' }

spec.user_target_xcconfig = { 'ONLY_ACTIVE_ARCH' => 'YES' } # 不推荐

我个人不喜欢第二行,因为pod 不应该污染目标项目,并且它可以在目标设置本身中被覆盖。因此,通过某种方式覆盖设置应该是消费者项目的责任。但是,这对于 podspecs 的成功 linting 可能是必要的。

但是,如果您无权访问 ,则.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
Run Code Online (Sandbox Code Playgroud)

我担心的一件事是,当我们实际存档库/应用程序时,这会产生什么影响。在归档应用程序期间通常采用“发布”配置,并且由于这将仅考虑当前运行目标的活动架构来创建发布版本,使用这种方法,我们可能会丢失目标版本中 armv7、armv7s 等的切片。但是,我注意到文档说(在附加图片中突出显示)当我们选择“通用 iOS 设备/任何设备”作为运行目标时,此设置将被忽略,因为它没有定义任何特定架构。所以我想如果我们存档我们的应用程序,选择它作为运行目标,我们应该会很好。

  • 这确实是苹果的一个令人惊讶的改变,我花了半天时间才发现我觉得苹果应该补偿:)。这不是一个有记录的更新(至少据我所知),并且肯定会影响每个升级到 Xcode 12 的人。我只希望每个人在了解基础知识后都能找到自己的方法来克服它。 (2认同)
  • 如果多个 Pod 规范使用 `user_target_xcconfig` 并且这些值不完全匹配,CocoaPods 将发出类似这样的警告:`[!] Can't merge user_target_xcconfig for pod Targets: [... list of pod ...]。单一构建设置 EXCLUDED_ARCHS[sdk=&lt;...&gt;] 具有不同的值。` podspec 语法参考表示“不推荐”此属性 https://guides.cocoapods.org/syntax/podspec.html#user_target_xcconfig。因此,请不要使用 `user_target_xcconfig` 来避免许多开发人员的麻烦。 (2认同)
  • 正确的!我想我已经在回答中提到过这一点。 (2认同)
  • 我最终设法使用 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' =&gt; 'arm64' 使其全部正常工作,但仅在 pod_target_xcconfig 中,并且仅在有问题的 pod(其中包括预构建的库)和依赖于的单个 pod 上有问题的 Pod。其他一切都保持干净。我决定我更喜欢它而不是主动拱形解决方案。 (2认同)
  • 在 Apple Silicon 上,这样做会导致另一个错误。这可能是由于某些特定的 Pod 造成的。我针对这些案例提出了一个具体问题。/sf/ask/4575542051/ (2认同)
  • 当在 Xcode &gt; 12 上基于 Intel 的 Mac 上构建模拟器时,这是一个很好的解决方法,以提示 Xcode 我们正在为具有 x86_64 架构的模拟器构建。不幸的是,它不适用于 M1 和模拟器(您可以作为解决方法在 Rosetta 上运行 Xcode 并包含 Ayan Sengupta 提出的建议)。正确的答案实际上是由 Tony Arnold 完成的 - 这一切都是为了在 Pod 中为模拟器提供适当的 ARM 切片(和 XCFramework 转换),并且应该由 Pod 供应商完成。 (2认同)

Sla*_*oll 100

找到了解决办法! https://developer.apple.com/forums/thread/657913

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

不包括模拟器的架构

  • 我正在 **Release** 模式下进行测试,因此我也必须将其添加到 Release 中 (11认同)
  • 这不适用于 M1 mac (8认同)
  • 这对我有用,但只有当我为arm64构建时才有效;模拟器不起作用。小吐槽:xCode 太荒谬了,12.5 个演出,大量的 Pod。与这种体验相比,构建 Android 简直就是在公园散步。 (7认同)
  • 我只需要 M1 Mac 并且它可以工作(没有 Rosetta;有了 Rosetta,我根本没有这个问题) 对我来说,答案是在我正在尝试编译的项目中 1. 架构是标准的 2.构建活动是NO 3。排除的是调试-&gt;任何iOS Sim SDK-&gt;arm64,但所有其他插槽都是空白希望这对其他人也有帮助。 (2认同)

Tom*_*ard 72

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

我在主项目的目标中更改了“排除的架构”,但没有更改 PODS 项目的目标。这是一颗真正隐藏的宝石。我已经被这个问题困扰了好几个星期了。

在 PODS PROJECT 中排除 arm64

  • 也不是完美的答案,现在您的项目无法在 M1 和模拟器上编译,因为所有 pod 都被排除 (2认同)

tri*_*ode 62

有效架构构建设置已在 Xcode 12 中删除。如果您在此构建设置中有值,则它们会导致问题,需要删除。

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

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

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

用户自定义设置

  • 这应该是公认的答案。确保选择应用程序项目而不是目标。否则,您将无法从构建设置中删除 VALID_ARCHS。:) (11认同)
  • @SivakrishnaPerla 如果您可以在 Xcode 11 中打开该项目,那么您可以准确地看到 Valid Architectures 用于哪些目标。您甚至可以清除 Xcode 11 中的设置,然后在 Xcode 12 中再次尝试该项目。如果您仍然需要解决方法并且在嵌入式框架上遇到错误,那么 SlashDevSlashGnoll 的答案应该有效。如果您需要解决方法并且在 Cocoapod 上遇到错误,请在安装后的 Podfile 中排除 arm64 架构。 (3认同)
  • @trishcode即使在这样做之后我也遇到同样的错误(xcode12 beta4),任何解决方法 (2认同)
  • @trishcode 谢谢,在排除的体系结构中设置 arm64 并删除 VALID_ARCHS 有效。 (2认同)

Hon*_*ney 50

前言

\n

当您构建应用程序时,您可以针对特定的“平台”和“CPU 架构”组合来构建它。

\n

iOS 平台:

\n
    \n
  • iOS设备"generic/platform=iOS"
  • \n
  • 模拟器"generic/platform=iOS Simulator"
  • \n
\n

注意:还有更多的平台。为简洁起见,我\xe2\x80\x99m 仅关注 iOS 平台。另外还有 macOS、watchOS、tvOS、visionOS 平台。

\n

CPU架构:

\n
    \n
  • ARM64
  • \n
  • x86_64
  • \n
\n

这是因为 macOS、iOS 和 iOS 模拟器将使用不同的库。请参阅iOS 设备和模拟器的构建实际上有何不同?

\n

并且不同的CPU架构使用不同的CPU指令。

\n

这最终意味着构建的二进制文件和您运行它的环境(设备/模拟器)需要匹配。否则,某些系统库将不会存在于操作系统上,或者 CPU 指令无法得到处理。

\n

这些设置在哪里以及谁更改了它们?

\n

此配置位于 Xcode Build Settings 中。它们影响发送到编译器的标志。通常 Xcode 会正确执行操作,您不需要进行任何调整。在某些情况下,它不会\xe2\x80\x99t或某人(应用程序创建者、库创建者、库消费者、包管理器,即对Podfile进行更改的人)以某种方式调整了这些设置,导致事情变得不对齐。

\n

你会一直致力于一种组合吗?

\n

不。如果您使用配置Release,那么您最终将同时归档您的产品arm64x86_64架构。

\n

在归档过程中(通常在 CI/CD 中),事情将会失败,因为模拟器架构也被选择了。

\n

然而,在物理设备上构建的“调试”不会尝试针对不同的平台或体系结构进行构建。这是因为它优先考虑“开发速度”而不是“完全正确性”。

\n

Xcode 的默认ONLY_ACTIVE_ARCH设置是:

\n

在此输入图像描述

\n

我有一台英特尔 MacBook。如果我不排除任何架构和平台,会发生什么?

\n
    \n
  • 如果您正在构建调试配置,那么它将仅针对目标平台的 CPU 架构进行构建。意义:

    \n
      \n
    • 如果您要构建到 iPhone 中,则只需要支持 ARM64
    • \n
    • 如果您要构建模拟器,则只需要支持 X86_64
    • \n
    \n
  • \n
  • 如果您正在构建发布配置,那么它将:

    \n
      \n
    • 为两个平台和所有可能的架构构建。
    • \n
    \n
  • \n
\n

我有一台 M1 MacBook。如果我不排除任何架构和平台,会发生什么?

\n
    \n
  • 如果您正在构建调试配置,那么它将仅针对目标平台的 CPU 架构进行构建。意义:

    \n
      \n
    • 如果您要构建到 iPhone 中,则只需要支持 ARM64
    • \n
    • 如果您要构建模拟器,则只需要支持 ARM64
    • \n
    • 或者,您可以为 Xcode 启用 Rosetta。在这种情况下,如果您正在构建模拟器,那么您还需要支持 X86_64。
    • \n
    \n
  • \n
  • 如果您正在构建发布配置,那么它将:

    \n
      \n
    • 为两个平台和所有可能的架构构建。
    • \n
    \n
  • \n
\n

为什么发布版本有所不同?

\n

在积极的开发过程中,您希望快速构建东西。你主动构建不需要使用的架构是没有意义的。这意味着,如果您正在构建设备,那么您只想针对该平台架构组合进行构建。您不想构建其他组合。

\n

但是,如果您要为其他人发布\xc2\xa0\xe2\x80\x94\xc2\xa0。然后,因为您不想限制/规定他们如何构建您的应用程序,所以您必须构建所有可能的组合,并确保您的框架可以为所有这些组合进行编译。

\n

对于应用程序来说,为模拟器平台制作存档可能没有什么意义,但是对于框架来说,您的用户是另一个开发人员。该开发人员将把您的框架构建到模拟器和真实设备中。因此,您需要支持平台和架构。

\n

CocoaPods 是问题的根源吗?

\n

这取决于。如果 pod 排除了某个架构,并且您正在尝试针对该架构进行构建,那么您必须要求 pod 所有者不要排除它。

\n

否则,如果您的所有 Pod 都支持您尝试构建的给定平台/架构,那么您在主机应用程序中自己编写的代码中就会出现问题。

\n

解决方案

\n
\n

使用 Apple 芯片支持更新预编译库

\n

如果错误消息中指定的库来自供应商,请参阅\n更新来自供应商的预编译库。如果您有该库的源代码,请将库重建为\nXCFramework,并支持 Apple 芯片上的模拟器。要了解\n如何构建 XCFramework,请参阅创建多平台二进制\n框架\n捆绑包

\n

更新供应商的预编译库

\n

如果产生构建错误的库是来自供应商的预编译库,并且您没有源代码,请联系供应商以获取支持 Apple 芯片的更新的 XCFramework。如果供应商提供更新\nisn\xe2\x80\x99,请暂时使用 EXCLUDED_ARCHS\nbuild 设置来排除模拟器 SDK 的 arm64,如下图所示。不要将 arm64 排除在任何其他 SDK 中。

\n

来自文档

\n
\n

有关解决方案结果的更多问题:

\n

如果我在“iOS Simulator”平台中排除 ARM64,会发生什么情况?

\n

您将无法直接构建到 M1 模拟器中。那么你必须在 M1 上使用 Xcode 和 Rosetta。这是一个 hack 并且速度稍慢。

\n

如果我在“iOS Simulator”平台中排除 X86,会发生什么情况?

\n

您将无法构建基于英特尔的模拟器。您也无法使用 Rosetta 构建模拟器。

\n

如果将 ARM64 排除在“iOS”平台上会发生什么?

\n

您将无法构建到物理设备中。也不为他们存档。糟糕的主意!

\n

那么我应该排除架构吗?

\n
\n

努力让您的应用程序(包括其所有预编译库)始终构建由 ARCHS 构建设置的默认值定义的完整架构集。仅在最终发布的应用程序未在特定架构上使用 target\xe2\x80\x99s 功能的目标上使用 EXCLUDED_ARCHS 构建设置,例如仅支持基于 Intel 的 Mac 计算机上的旧功能的 Mac 应用程序。不要修改 ARCHS 构建设置来获得相同的结果。

\n
\n

此外,在大型团队中,一些开发人员可能使用 M1,而另一些开发人员则使用基于 Intel 的较旧 MacBook。您永远不知道也许有一天会出现一款具有独特架构的 M5 Macbook。因此,最好考虑如何使您的项目/产品/框架与您自己的开发人员和库消费者兼容。

\n

我们有配备 Intel X86_64 的 iOS 设备吗?

\n

这样的事情不存在。

\n

如何检查二进制文件?

\n

您可以使用lipo,filedyld_info

\n
    \n
  • lipo并且file只给你架构信息。

    \n
  • \n
  • dyld_info为您提供架构、平台信息等

    \n
  • \n
\n

查看对终端应用程序二进制文件的简单检查的比较:

\n

在此输入图像描述

\n

请记住,在 XCFramework 中通常会有两个或更多二进制文件。例如,如果我们刚刚使用,lipo -info我们必须在库的两个二进制文件上执行此操作:

\n
lipo -info <path-to-binary>\n
Run Code Online (Sandbox Code Playgroud)\n

在 xcframework 包内的 arm64 目录中,\n我看到:

\n
Non-fat file: /Users/mfaani/Video.xcframework/ios-arm64/Video.framework/Video is architecture: arm64\n
Run Code Online (Sandbox Code Playgroud)\n

对于模拟人生我看到:

\n
Architectures in the fat file: /Users/mfaani/Video.xcframework/ios-arm64_x86_64-simulator/Video.framework/Video are: x86_64 arm64 \n
Run Code Online (Sandbox Code Playgroud)\n

您可以进入您的 mac 的/应用程序,右键单击;任何应用程序的“显示包内容”;找到应用程序的关联二进制文件。然后使用检查它lipo

\n

需要明确的是,框架或应用程序都可以使用 进行检查lipo。同样,如果您访问模拟器上的构建文件夹,您也可以检查二进制文件。

\n

XCFramework 和 FAT 二进制文件有什么区别?

\n
    \n
  • FAT 二进制文件只是一个二进制文件 \xe2\x80\x94,其中两个(或更多)架构组合成一个二进制文件。之所以叫FAT,是因为它被加肥了。它的其他名称是“多架构二进制文件”或通用二进制文件
  • \n
  • XCFramework 只是一个结构化文件夹,一个包装器。而已。每个平台都有不同的文件夹。每个文件夹内都有一个二进制文件。该二进制文件可以是 FAT 二进制文件或非 FAT(单一架构)。
  • \n
\n

另请注意,FAT 二进制文件可以是框架,也可以是应用程序的二进制文件。XCFramework 只是一个框架。从来都不是应用程序本身。

\n

我的应用程序是否因我不需要的所有其他平台架构组合而变得臃肿?

\n

XCFramework 不会使应用程序商店提交变得臃肿,因为 iOS 设备的存档只会从与模拟器平台隔离的目录中获取每个框架。

\n

然而,对于 FAT 二进制文件,由于它只是一个二进制文件,因此您必须在提交到 Apple 商店之前对依赖项进行精简/切片。否则你会得到以下错误:

\n
\n

不受支持的架构。您的可执行文件包含不受支持的体系结构“[x86_64,i386]”。

\n
\n

有关该问题及其之前解决方案的更多信息,请参阅此处

\n

需要明确的是,这是 xcode 12 之前版本中的一个问题。但并非每个项目设置都会面临这个问题。只有您有来自供应商的一些预编译依赖项(他们没有共享其源代码,而只是共享 FAT 二进制文件,以便您可以为设备和 sim 构建应用程序)时,您才会遇到这种情况,否则如果如果您有权访问源代码,那么您的存档将不包含这两种体系结构的编译。它仅包含目标架构的二进制文件。

\n

另请参阅这篇精彩的博客文章,了解更多详细信息和历史背景。

\n

FAT 的文件夹结构是什么样的?

\n

它只是一个二进制文件。它不是一个文件夹。该二进制文件适用于两个或多个架构。

\n

xcframework 的文件夹结构是什么样的?

\n
ios-arm64\n   - binary\nios-arm64_x86_64-simulator\n   - (FAT) binary\n
Run Code Online (Sandbox Code Playgroud)\n

如果 XCFramework 与 mac Catalyst 一起使用,那么文件夹结构将如下所示:

\n
ios-arm64\n    - binary\nios-arm64_x86_64-simulator\n    - (FAT) binary\nios-x86_64-maccatalyst\n    - binary\n
Run Code Online (Sandbox Code Playgroud)\n

有关可能平台的更全面列表。请参阅XCFrameworsk:创建 xcframeworks 及其与静态库和 Swift 包的协作并将其集成的演示

\n

为什么我的供应商不支持 ios-arm64-simulator?

\n

这可能有多种原因。

\n
    \n
  • 迁移工作:通常只是编译时没有 M1,而且编译已经很长时间了,如果编译则必须进行一些更改。就像您必须了解的那样,多年来我们并不需要新的架构平台组合。所以这是新的,并不是每个人都能理解。事实上,Swift 现在与其之前的版本实现了 ABI 兼容,减少了框架所有者在每个新的 Swift 版本中重新编译其应用程序的需要。所以它们可以持续使用数年而无需重新编译......
  • \n
  • 限制:预编译库依赖于另一个不是为arm64-sim编译的预编译库。
  • \n
  • 该框架的所有者没有 Apple Silicon (arm64) 机器。或者知道这些事情的人已经离开了公司。
  • \n
\n

最后还有什么话要说吗?

\n

确保查看所有项目和目标以及 Pod 项目和 Pod 目标设置。如果其中之一排除了某种架构,那么您就无法为该架构构建应用程序。通常这可能位于您的 Podfile 中。

\n

或者,如果 pod/框架是在完全不同的存储库中编译的,那么您在那里设置的设置才是最重要的。

\n

如果您注意收到的错误消息,应该很容易导航到不支持的目标。一旦确定了目标,您就必须使用上面两段中的注释来确定编译它的时间/地点。

\n


Run*_*der 33

Xcode 12.3

我通过将 Validate Workspace 设置为 Yes 解决了这个问题

在此处输入图片说明

  • 没有解决我的问题 (21认同)
  • 它应该做什么?为什么它有效?最好[更新你的答案](https://stackoverflow.com/posts/65306476/edit)。(但是***没有***“编辑:”、“更新:”或类似内容 - 答案应该看起来就像今天写的一样。) (7认同)
  • 该选项没有向我显示,我使用的是 xcode 14.0.1 (5认同)

s-h*_*ter 30

截至 2022 年 9 月 19 日,现有答案都不适合我。大多数答案建议从构建设置中排除arm64,完成此操作后,它会给出致命错误:找不到模块映射文件

\n

对我有用的是使用 Rosseta 打开 Xcode

\n
    \n
  1. 右键单击应用程序文件夹中的Xcode
  2. \n
  3. 获取信息
  4. \n
  5. 使用 Rosetta检查打开情况
  6. \n
  7. 打开Xcode
  8. \n
  9. 打开项目
  10. \n
  11. 清理构建文件夹
  12. \n
  13. 运行项目
  14. \n
\n

通过使用 Rosseta 打开 Xcode,不需要其他构建设置或配置。

\n

这可能不是一个长期的解决方案,但可以快速解决问题。使用 Xcode 14.3.1升级到MAC OS 13.5后,不再有使用 Rosseta 选项打开,但您可以执行以下操作在 Rosseta 上运行它。

\n
    \n
  1. 转到菜单栏中的\xe2\x80\x9c产品\xe2\x80\x9d
  2. \n
  3. 目的地
  4. \n
  5. 目的地架构
  6. \n
  7. 显示两者
  8. \n
  9. 从设备下拉菜单中选择旁边有 Rosseta 的模拟器。
  10. \n
  11. 运行项目。
  12. \n
\n

参考:

\n\n


Ton*_*old 29

我意识到这个问题有点旧,但建议的答案已经过时/不正确。

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

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

  • 确实如此,因为排除或包含架构的修改仅适用于基于 i386 的计算机。 (3认同)

pro*_*mer 25

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

  • 仅构建活动架构设置为 YES
  • 添加排除的架构并将其值设置为arm64(见附件)
  • 将活动方案(在项目名称旁边的工具栏上)设置为任何 iOS 模拟器
  • 从产品菜单中清理构建文件夹并构建。

在此输入图像描述


Rag*_*hav 22

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

构建设置 >> 排除的架构

在“Any iOS Simulator SDK”选项的发布和调试模式中添加了“arm64”。

在此处输入图片说明


小智 21

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 及更高版本上打开应用程序。

如果排除arm64,应用程序将无法在iOS 11及更高版本中打开,并会显示此弹出窗口

因此,不要选择整个项目,只排除 Arm64 模拟器的架构。

步骤: 在项目文件顶部,选择目标 > 构建设置 > 架构 > 排除的架构。现在添加选择“任何 iOS 模拟器 SDK”并为其指定值 arm64。

请参阅下图以供参考。

仅在排除的体系结构中选择“任何 iOS 模拟器 SDK”,而不是在整个项目中排除它。


Nav*_*tor 14

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

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


小智 14

我通过在项目目标和 pod 目标的“排除架构”中添加“arm64”来解决问题。

Xcode -> Target Project -> Build Setting -> Excluded Architectures > "arm64"

Xcode -> Pod Target -> Build Setting -> Excluded Architectures > "arm64"


Med*_*dhi 14

如果您在 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
Run Code Online (Sandbox Code Playgroud)


小智 11

在尝试和搜索不同的解决方案后,我认为最安全的方法是在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
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您只能将 iOS 模拟器的编译器架构覆盖为当前 CPU 的架构。与其他解决方案相比,此解决方案也适用于采用Apple Silicon 的计算机。

  • 很高兴看到有人至少理解了这个问题,并且不建议仅仅删除 Apple Silicon 对 iOS 模拟器的支持。 (3认同)

Cra*_*kIt 11

从 Xcode 14.3 开始,只需执行此操作。转至产品 -> 目标 -> 目标架构并选择显示两者。现在您可以在目的地看到 Rosetta 模拟器。

在此输入图像描述


小智 9

1.在所有目标中添加arm64Build settings-> Exclude Architecture

Xcode 屏幕截图

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

  1. 在 Finder 中右键单击 Xcode
  2. 获取信息
  3. 与罗塞塔一起打开


Bos*_*ngo 9

我找到

  1. 使用 Rosetta(在 Finder 中查找 Xcode > 获取信息 > 使用 Rosetta 打开)
  2. Build Active Architecture OnlyYES在 Project 和 Target 中都设置为
  3. (您可能不需要它,请阅读下面的评论)并将其包含在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
Run Code Online (Sandbox Code Playgroud)

为我工作。

我们有 Pod 和 SPM,但它们不能与其他答案的任何组合一起使用。我的同事都使用英特尔 MacBook,一切仍然对他们有用!

  • 天啊,经过 4 个小时的挖掘,你的答案解决了我的问题!我使用的是“M1 Mac”,也使用“CocoaPods 和 SPM”。我认为以上所有答案仅用于修复 CocoaPods,但不能解决 SPM 的问题。你是对的,我实际上不需要你的第 3 步,只需要前 2 个步骤,一切都有效!谢谢你! (3认同)

Pra*_*dha 8

Xcode 12

VALID_ARCH用户定义组下的构建设置中删除对我有用。

在此处输入图片说明


8HP*_*HP8 8

轻松修复

  1. 右键单击应用程序文件夹中的 xcode
  2. 获取信息
  3. 选择“使用 Rosetta 打开”

跑。

Xcode 获取信息

  • 不太好,现在您正在 Rosetta 模拟器上运行 Xcode,这意味着您的东西运行缓慢 (12认同)
  • 从 Xcode 14.3 开始,这似乎不再有效。我现在安装了 14.2 和 14.3。前者有“使用 Rosetta 打开”选项。后者则不然。 (4认同)

evy*_*vya 8

在新的 Mac OS 上要解决该问题,您应该在 Xcode 上使用 Rosetta 运行

去:

Xcode -> Product -> Destination -> Destination Architectures -> Show Both
Run Code Online (Sandbox Code Playgroud)

现在您的所有模拟器都将拥有一个 Rosetta 模拟器

** 使用 Rosetta 模拟器之一运行您的代码,就可以开始了**


ind*_*_gt 7

我在从命令行构建框架时遇到问题。我的框架依赖于缺少对基于 ARM 的模拟器的支持的其他框架。在升级依赖项之前,我最终排除了对基于 ARM 的模拟器的支持。

EXCLUDED_ARCHS=arm64从 CLI 构建模拟器框架时,我需要这个标志。

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
Run Code Online (Sandbox Code Playgroud)

  • 同样在这里。这种情况下的关键“问题”实际上是通过 `-destination "generic/platform=iOS Simulator"` 构建通用目标。这导致了针对所有可用架构的构建,其中包括自 Xcode 12 以来的 arm64。 (2认同)

btx*_*ios 6

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

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

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

  • 使用 Xcode,VALID_ARCHS 位于选择项目(而不是目标)中,然后选择“构建设置 -&gt; 用户定义”。选择它并删除它。 (2认同)

小智 6

转到Finder -> 应用程序 -> Xcode -> 右键单击​​ Xcode -> 选择使用 Rosetta 打开

在此输入图像描述


jac*_*son 5

在你的 xxx.framework podspec 文件中添加 follow config 避免 pod 包包含 arm64 similator archs

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
Run Code Online (Sandbox Code Playgroud)

  • @FernandoReynoso 我刚刚收到了开发人员过渡套件,(ARM MacMini)将在今天晚些时候进行测试和报告 (2认同)

wil*_*ess 5

在尝试了该线程上的几乎所有帖子并阅读了苹果开发者论坛后,我发现只有一个解决方案对我有用。

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

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

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

接下来,您必须更改以下项目Build Settings

  • 删除VALID_ARCHS用户定义的设置
  • 设置ONLY_ACTIVE_ARCHYES***

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


Sun*_*rge 5

更新:2020 年 10 月

arm64您只需设置为Debug > Simulator - iOS 14.O SDK“排除架构”即可。

在此输入图像描述

  • 你确定吗?这是否意味着它实际上无法在配备 Apple Silicon 的机器上运行? (8认同)

Yaz*_*fir 5

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

您可以通过转到“菜单”>“产品”>“清理构建文件夹”或简单地使用 Command+Shift+K 来完成此操作。


小智 5

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

\n

对我来说解决这个问题的是强制 Xcode 通过 Rosetta 打开。

\n

为了达成这个:

\n

右键单击“应用程序”文件夹中的 Xcode* \xe2\x86\x92获取信息\xe2\x86\x92 选中“使用 Rosetta 打开”复选框。

\n


小智 5

Xcode 13.2.1、macOS v12 (Monterey)、目标 iOS 14.0 和 CocoaPods 1.11.2

LogRocket我在包含和/或时遇到了类似的问题Plaid——它们是xcframeworks 并且在我的本地工作正常,但它们不能构建在 bitrise 上。我尝试了上面所有的答案:

  • EXCLUDED_ARCHSARM64
  • 在 Podfile 中设置ONLY_ACTIVE_ARCHYES
  • VALIDATE_WORKSPACEYES
  • 在 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
Run Code Online (Sandbox Code Playgroud)


小智 5

请确保提供您遇到的代码或具体错误消息,因为这将有助于提供更准确的解决方案。

关于所提供的信息,您似乎正在尝试更改architecture应用程序的。要解决此问题,您可以按照以下步骤操作:

第 1 步:打开项目并导航至“Build Settings”选项卡。

步骤 2:在“排除的架构”部分中,为“更改版本”选项选择“是”。

步骤 3:在“调试”和“发布”选项卡下,单击“+”按钮并选择iOS simulator SDK.

步骤 4:选择“arm64”作为调试和发布配置的架构。

在此输入图像描述

请注意,具体步骤可能会根据您的开发环境和工具的不同而有所不同。如果您遇到任何问题或需要进一步帮助,请随时提供更多详细信息以获得更准确的解决方案。


归档时间:

查看次数:

259892 次

最近记录:

4 年 前