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

时间:2021-01-31 11:04:40

标签: ios xcode cocoa-touch 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,根据 its doc,应该支持 arm64,所以我很困惑为什么会抛出上述错误。正如我之前所说,它在我认为在 arm64 上运行的真实设备中编译得很好。

根据文档..

<块引用>

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

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

  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 无法编译使用 x86_64 在 iOS 模拟器中运行。所以在这种情况下我不能同时使用它们。

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

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

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

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

2 个答案:

答案 0 :(得分:14)

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

我发现 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 模拟器中运行的情况下使事情顺利进行。 . 还没有。

答案 1 :(得分:1)

退出 Xcode。 转到 Finder 并打开应用程序文件夹。 右键单击 Xcode 应用程序,选择获取信息 在“Xcode Info Window”中勾选使用 Rosetta 打开。 打开 Xcode 并再次尝试运行。enter image description here