【问题标题】:Xcode building for iOS Simulator, but linking in an object file built for iOS, for architecture 'arm64'Xcode 12,为 iOS 模拟器构建,但在为 iOS 构建的对象文件中链接,用于架构“arm64”
【发布时间】:2020-12-15 19:35:14
【问题描述】:

我正在尝试在 Xcode 12(测试版 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

当我在框架上运行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
  • 我(在我的开发环境中使用 XCode 12.4 和使用 Xcode2.2 的 App Center 管道)已经尝试了该线程上的所有建议。他们都没有解决我的问题。该应用程序现在可以在模拟器和设备上运行,但始终无法使用通用设置 Any iOS Device (arm64 armv7) 归档。该错误在点击命令 ~\clang -target armv7-apple-ios10.0 后出现,给我错误 ld: framework not found Pods_XXX

标签: ios xcode xcode12 xcode12beta5 xcode12beta6


【解决方案1】:

轻松修复

  1. 在 Applications 文件夹中右击 xcode
  2. 获取信息
  3. 选择“使用 Rosetta 打开”

运行。

Xcode get info

【讨论】:

  • 太棒了!它对我有用。谢谢一百万。
  • 这对我来说已经足够了!当我们迁移到 M1 mac 时,带有许多插件(包括 Firebase)的 Cordova 项目开始出现此错误。
  • 这是唯一适用于 Apple M1 处理器的答案。
【解决方案2】:

我发现了

  1. 使用 Rosetta(在 Finder 中查找 Xcode > 获取信息 > 使用 Rosetta 打开)
  2. Build Active Architecture Only 设置为 YES 用于项目和目标中的所有内容
  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

为我工作。

我们同时拥有 Pod 和 SPM,但它们无法与其他答案的任何组合一起使用。我的同事们都使用英特尔 MacBook,而且一切都还适用于他们!

【讨论】:

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

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

【讨论】:

  • 怎么样?通过一些菜单命令?通过手动删除文件或文件夹?你能详细说明吗?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
【解决方案4】:

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

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

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

【讨论】:

  • 这对我有用。这很可怕,但它奏效了。
  • 工作,谢谢,用rosetta打开是关键
【解决方案5】:

在尝试和搜索了不同的解决方案之后,我认为最安全的方法是在 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,它是唯一有效的
【解决方案6】:

Xcode 12.3

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

【讨论】:

  • 解决了我的问题。最简单的修复!我很高兴这已解决,但有人可以解释一下这是如何解决问题的吗?
  • 我遇到了 UI 测试和 KIF 库的问题(它是使用 KIF 的 Xcode 单元测试)。我尝试了所有其他解决方案,但在为这些单元测试启用“验证工作区”之前没有任何效果。谢谢!
  • 这是唯一对我有用的解决方案,但它确实在调试器中保留了“目标完整性”警告。
  • 在过去几天尝试了所有其他解决方案都没有成功后,这个解决方案在我的 Xcode 12.2 上为我工作。
  • 这解决了我在 Xcode 12.5.1 上的 React Native 项目的问题。谢谢!
【解决方案7】:

排除 arm64 后,我总是得到 ARCHS[@]: unbound variable。对我来说,唯一的解决方案是将 x86_64 添加到目标构建设置中,如此处所述Problems after upgrading to Xcode 12:ld: building for iOS Simulator, but linking in dylib built for iOS, architecture arm64 您也可以删除之前添加的排除 arm64。

【讨论】:

    【解决方案8】:

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

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

    然后在您配置 Carthage 之后。将 arm64 放在构建设置的“排除架构”中。

    尝试使用模拟器运行您的项目。模拟器应该可以正常运行。

    【讨论】:

      【解决方案9】:

      当我将 $(ARCHS_STANDARD) 设置为 VALID_ARCHS 以调试任何 iOS 模拟器 SDK 时,它对我有用。 我还设置了YESONLY_ACTIVE_ARCH 进行调试。

      【讨论】:

      • 这在 Xcode 12.4 中对我有用 -> 添加新的用户定义的 VALID_ARCHS 值 $(ARCHS_STANDARD)
      【解决方案10】:

      更新:2020 年 10 月

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

      【讨论】:

      • 你确定吗?这是否意味着它实际上不会在装有 Apple Silicon 的机器上运行?
      【解决方案11】:

      Build Settings 上搜索VALID_ARCH,然后按delete。 这应该适用于 Xcode 12.0.1

      【讨论】:

      • 我没有找到VALID_ARCH,这是什么?
      • 在构建设置中点击,单击顶部区域的 + 按钮,然后选择“添加用户定义的设置”。
      • 可以给它添加“路径”(一系列动作)吗?
      【解决方案12】:

      在我的例子中:Xcode 12

      我在EXCLUDED_ARCHS 上设置空值并设置ONLY_ACTIVE_ARCH Debug = YES Release = NO Project's Build Setting

      我将它包含在我的 Podfile 中:

      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"
              end
          end
      end
      

      它可以在我的 Simulator iPhone 8 (iOS 12) 和 iPhone 11 Pro Max (iOS 14) 以及我的设备 iPhone 7 Plus (iOS 13.4) 上运行

      【讨论】:

        【解决方案13】:

        "Build Active Architecture Only"(ONLY_ACTIVE_ARCH) 构建设置设置为yes,xcode 要求使用arm64,因为Silicon MAC 架构是arm64。

        arm64 已添加为 Xcode12 中的模拟器架构以支持 Silicon MAC。

        /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json

        【讨论】:

        • 如果它不在硅 Mac 上运行,那么它肯定应该知道不使用 arm64 吗?
        • @Jonathan。是的,应该这样做,但目前不是。
        • 什么是“硅MAC”?你的意思是Apple M1?还是Apple silicon?
        【解决方案14】:

        Xcode 12

        为我从 User-Defined 组的 Build settings 中删除 VALID_ARCH

        【讨论】:

        • 删除?你的意思是把它的值变成空的东西吗?
        • 是的,从构建设置中删除它。它对我有用。
        • 终于搞定了,谢谢。我从 project.pbxproj 文件中删除了。
        【解决方案15】:

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

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

        【讨论】:

          【解决方案16】:

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

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

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

          【讨论】:

          • 使用 Xcode,VALID_ARCHS 在选择项目(不是目标),然后是 `Build Setting -> User-Defined"。选择它并删除它。
          • 这个解决方案对我有用。其他一些人建议的解决方案不起作用,因为只是将值 'arm64' 添加到“排除架构”字段开始为生成的 .app 文件提供一些“文件权限”错误。
          • 感谢@btxios 和Akshay。工作就像一个魅力,它的派对时间
          猜你喜欢
          • 2021-01-08
          • 2021-12-25
          • 1970-01-01
          • 1970-01-01
          • 2021-04-28
          • 2021-01-07
          • 2021-01-27
          • 2021-05-04
          • 2021-04-09
          相关资源
          最近更新 更多