【问题标题】:Xcode error 'building for iOS Simulator, but linking in dylib built for iOS .. for architecture arm64' from Apple Silicon M1 MacXcode 错误“为 iOS 模拟器构建,但在为 iOS 构建的 dylib 中链接 .. 用于架构 arm64”来自 Apple Silicon M1 Mac
【发布时间】:2021-05-04 18:47:19
【问题描述】:

我有一个应用程序,它在物理设备和 iOS 模拟器中配备英特尔处理器的旧 Mac 上编译和运行良好。

同样的应用程序也可以在具有 物理 iPhone 设备的新 Apple Silicon Mac 上编译和运行良好,它拒绝为 iOS 模拟器编译。 p>

如果没有模拟器支持,调试周转时间会变得很长,所以我正在尝试解决这个问题。更不用说 Xcode 预览功能也不起作用,这很烦人。

我遇到的第一个错误(但从 Intel Mac 转移到 M1 Mac)如下所示。

building for iOS Simulator, but linking in dylib built for iOS, file '/Users/andy/workspace/app/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' for architecture arm64

我使用的 Cocoapods 库是 GoogleWebRTC,根据its doc,应该支持 arm64,所以我很困惑为什么会抛出上述错误。正如我之前所说,它在我认为在 arm64 上运行的真实设备中编译得很好。

根据文档..

此 pod 包含二进制形式的 WebRTC iOS SDK。这是一个动态的 包含 armv7、arm64 和 x86_64 切片的库。位码是 不支持。我们目前提供的 API 仅适用于 Objective C。

我在网上搜索并it appears 似乎有 2 种解决方法来解决此问题。

  1. 第一个是将arm64添加到Excluded Architectures
  2. 第二个选项是将Build Active Architecture Only 标记为Release 构建。

即使我在运行在 arm64 架构下的 M1 Mac 上编译我的应用程序时,我也不完全了解上述是否有必要,因为该解决方案似乎仅适用于不支持 arm64 模拟器的 Intel Mac,因为对于 Intel Mac,模拟器可能在 x86_64 中运行,而不是在 arm64 中运行,因此解决方案 #1 不适用于我的情况。

当我只调整第二个更改时,并没有真正发生任何变化,并且会引发相同的错误。

当我进行两项更改并尝试构建时,我现在在构建期间收到以下第二个错误。 (不是 100% 确定我是否解决了第一个错误/我可能通过调整两个更改引入了第一个错误之外的第二个错误)

Could not find module 'Lottie' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator

我正在使用的第二个库是 lottie-ios,我正在使用 swift 包管理器将其引入。我想正在发生的事情是因为我在 iOS 模拟器的构建设置中排除了arm64,Xcode 正试图在x86_64 中运行我的应用程序。但是,由于某种原因,库不支持在 x86_64 中运行,并且会引发错误。对于库是否可以在 x86_64 或 arm64 中运行,我没有太多见解,因此我无法深入研究这个问题。

我的弱结论是 GoogleWebRTC 不能被编译以在带有 arm64 的 iOS 模拟器中运行(与 its doc 所说的不同),并且 lottie-ios 不能被编译为在带有 @987654337 的 iOS 模拟器中运行@。所以在这种情况下我不能同时使用它们。

第一季度。我想知道我可以做什么样的改变来解决这个问题...

当从 Intel Mac 编译时,该应用程序可以在设备和模拟器中完美地编译和运行。当从 Apple Silicon Mac 编译时,该应用程序在设备中编译和运行良好。只是应用程序拒绝在 Apple Silicon Mac 的 iOS 模拟器中编译和运行,我似乎无法弄清楚原因。

第二季度。如果没有可用的解决方案,我想首先了解为什么会发生这种情况。

我真的不想再买旧的 Intel Mac 只是为了让模拟器在模拟器上运行。

【问题讨论】:

  • 遇到了类似的问题。您找到解决Could not find module 'X' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator 问题的方法了吗?
  • 我发布了一个答案。我希望这有助于解决您遇到的问题..

标签: ios xcode cocoa-touch apple-silicon


【解决方案1】:

回答我自己的问题,希望能帮助遇到类似问题的其他人。 (直到另一个用户添加了一个好的答案)

我发现 GoogleWebRTC 实际上需要根据其源代码库使用x64 编译其源代码。

对于面向 iOS 设备的构建,这应设置为“arm”或“arm64”,具体取决于设备的架构。 要在模拟器中运行构建,应将其设置为“x64”。

https://webrtc.github.io/webrtc-org/native-code/ios/

这一定是我收到以下错误的原因。

building for iOS Simulator, but linking in dylib built for iOS, file '/Users/andy/workspace/app/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' for architecture arm64

如果我错了,请纠正我,但默认情况下,运行在 Apple M1 芯片上的 Xcode 似乎启动了 arm 拱型的 iOS 模拟器。由于我的应用在 Intel Mac 的模拟器上运行良好,因此我暂时采用了以下解决方法。

  1. 退出 Xcode。
  2. 转到 Finder 并打开应用程序文件夹。
  3. 右击Xcode应用,选择Get Info
  4. 在“Xcode 信息窗口”中检查Open using Rosetta
  5. 打开 Xcode 并再次尝试运行。

这就是我需要做的所有事情,以使我的应用程序(它依赖于 arm 模拟器尚未完全支持的库)再次运行。 (我相信在 Rosetta 模式下启动 Xcode 也会在 x86 中运行模拟器......??这解释了为什么在进行上述更改后一切正常)

许多在线资源(通常在 2020 年 11 月 M1 Mac 发布之前发布)都谈到“将 arm64 添加到 Excluded Architectures”,但该解决方案似乎仅适用于 Intel Mac,而不适用于 M1 Mac,因为我无需进行更改即可使事情再次正常运行。

当然,在 Rosetta 模式下运行 Xcode 不是永久解决方案,Xcode 会减慢一点速度,但它是一种临时解决方案,可以在您使用的某个库无法在 arm64 模拟器中运行的情况下让事情顺利进行。 . 然而。

【讨论】:

  • 因此,您正在构建一个在 ARM 处理器上的 x86 模拟器上运行的 x86 应用程序。我想会有不止一个构建脚本假设模拟器在 x86 上运行。
  • 非常感谢@user482594。它工作:)
  • 非常感谢您。只是偶然发现了你的答案,它为我节省了几个小时挠头的时间,哈哈。
  • 如上所述,更好的解决方案是设置您的项目以强制模拟器以 x86 而非所有 Xcode 运行。这允许 Xcode 在 Apple Silicon 下全速编译。以下文章(不是我的)解释了这一点。 blog.sudeium.com/2021/06/18/…
  • 切换到 Rosetta 就像是最后的手段。我没有 M1 来模拟 x86_64。就像说的那样,基本上我正在开发一个 ARM 应用程序(iOS),但模拟一个完整的 x86 环境 0_o
【解决方案2】:

退出 Xcode。 转到 Finder 并打开应用程序文件夹。 右键单击 Xcode 应用程序,选择 Get Info 在“Xcode 信息窗口”中检查 Open using Rosetta。 打开 Xcode 并再次尝试运行。enter image description here

【讨论】:

  • 您可以这样做,但更好的解决方案是设置您的项目以强制模拟器以 x86 而非所有 Xcode 运行。以下文章(不是我的)解释了这一点。 blog.sudeium.com/2021/06/18/…
【解决方案3】:

Apple 不支持通过 Rosetta 运行 Xcode 模拟器。有很多错误。

最好通过 Cocoapods 隔离有问题的库并仅将它们构建到受支持的架构。

post_install do |installer|  
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      # Targets that do not support m1 simulator
      if ['Lib1', 'Lib2'].include? target.name
        config.build_settings['ARCHS[sdk=iphonesimulator*]'] = 'x86_64'
      end
    end
  end
end

然后您可以使用#if 来隔离使用此框架的代码。

#if !((arch(arm64)) && targetEnvironment(simulator))
// Not M1
#else
// M1
#endif

附: 这是create pod with any framework的方法。

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2022-06-23
    • 2021-01-27
    • 2020-12-15
    • 2021-01-07
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多