Xcode 错误“为 iOS 模拟器构建,但链接到为 iOS 构建的 dylib .. 来自 Apple Silicon M1 Mac 的架构 arm64”

use*_*594 12 xcode cocoa-touch ios apple-silicon

我有一个应用程序,它可以在旧 Mac 上在物理设备和 iOS 模拟器中使用 Intel 处理器编译并运行良好。

同一个应用程序也可以在带有 M1 处理器的较新 Apple Silicon Mac 和物理 iPhone 设备上编译并运行良好,但是,它拒绝为 iOS 模拟器编译。

如果没有模拟器支持,调试周转时间会变得很长,所以我试图解决这个问题。更不用说 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,根据它的文档,应该支持 arm64,所以我很困惑为什么会抛出上述错误。正如我之前所说,它在我认为在 arm64 上运行的真实设备中编译得很好。

根据文档..

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

我在网上搜索,似乎有两种解决方法可以解决此问题。

  1. 第一个是通过添加arm64Excluded Architectures
  2. 第二个选项是标记Build Active Architecture OnlyRelease构建。

即使我在运行在 arm64 架构下的 M1 Mac 上编译我的应用程序,我也不完全明白是否需要以上内容,因为该解决方案似乎仅适用于不支持 arm64 模拟器的英特尔 Mac,至于英特尔 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 包管理器将其引入。我想发生的事情是因为我arm64在 iOS 模拟器的构建设置中排除了,Xcode 试图在x86_64. 但是,x86_64由于某种原因,库不支持运行,并且会引发错误。我对决定库是否可以在 x86_64 或 arm64 中运行的原因没有太多了解,所以我无法深入调查这个问题。

我的弱结论是由于某种原因GoogleWebRTC无法编译在 iOS 模拟器中运行arm64(不像它的文档所说的那样),并且lottie-ios无法编译为在 iOS 模拟器中运行x86_64. 所以在这种情况下我不能同时使用它们。

一季度。我想知道我可以进行哪些更改来解决此问题...

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

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

我真的不希望再购买旧的 Intel Mac 只是为了在模拟器中工作。

use*_*594 26

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

我发现 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 模拟器中运行......

  • 如上所述,更好的解决方案是设置项目以强制模拟器以 x86 而非全部 Xcode 运行。这使得 Xcode 可以在 Apple Silicon 下全速编译。下面的文章(不是我的)解释了这一点。https://blog.sudeium.com/2021/06/18/build-for-x86-simulator-on-apple-silicon-macs/ (14认同)
  • 切换到 Rosetta 就像是最后的手段。我没有获得 M1 来模拟 x86_64。就像所说的,基本上我正在开发一个 ARM 应用程序(iOS),但模拟一个完整的 x86 环境 0_o (3认同)
  • 因此,您正在构建一个在 ARM 处理器上的 x86 模拟器上运行的 x86 应用程序。我猜想会有不止一个构建脚本假设模拟器在 x86 上运行。 (2认同)

Das*_*oga 19

我在这里找到了修复方法,谢谢@Narlei

1-在项目中设置排除arm64架构

在此输入图像描述

2- 这位于 Podfile 的末尾

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
Run Code Online (Sandbox Code Playgroud)