首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“为iOS模拟器构建Xcode错误,但在为iOS构建的dylib .用于体系结构arm64的dylib中链接”来自苹果硅M1 Mac

“为iOS模拟器构建Xcode错误,但在为iOS构建的dylib .用于体系结构arm64的dylib中链接”来自苹果硅M1 Mac
EN

Stack Overflow用户
提问于 2021-01-31 11:04:40
回答 5查看 23.1K关注 0票数 35

我有一个应用程序,可以在旧的Mac电脑上编译和运行,在物理设备中使用英特尔处理器& iOS模拟器。

同样的应用程序也可以在更新的苹果硅Mac电脑上编译和运行,它带有M1处理器和物理 iPhone设备,但拒绝为iOS模拟器编译。

没有模拟器的支持,调试周转时间会变得非常长,所以我正试图解决这个问题。更别提Xcode预览功能也不起作用,这是很烦人的。

我在没有做任何更改的情况下遇到的第一个错误(但从Intel迁移到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切片。不支持Bitcode。我们目前提供的API仅为目标C。

我在网上搜索,看上去似乎有两个解决这个问题的方法。

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

即使我在运行在M1 Mac上的arm64架构下编译我的应用程序时,我也不完全理解上面的内容是否必要,因为该解决方案似乎只适用于不支持arm64模拟器的Intel,就像Intel一样,模拟器可能运行在x86_64中,而不是arm64上,所以解决方案1不适用于我的情况。

当我只适应第二个更改时,没有什么真正的改变,也会抛出相同的错误。

当我进行两次更改并尝试构建时,我现在在构建过程中得到以下第二个错误。(不太确定我是否解决了第一个错误/除了第一个错误之外,我还可能通过两个更改引入了第二个错误)

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

我使用的第二个库是lottie-ios,我使用的是一个快速包管理器。我想是因为我在iOS模拟器的构建设置中排除了iOS,所以Xcode试图在x86_64中运行我的应用程序。但是,由于某些原因,不支持在x86_64中运行库,并且正在引发错误。我不太了解是什么决定了库是否可以在x86_64或arm64中运行,所以我无法深入研究这个问题。

我的弱结论是,由于某些原因(与GoogleWebRTC所说的不同),不能编译iOS模拟器以在arm64中运行,而不能编译lottie-ios以在x86_64的iOS模拟器中运行。所以在这种情况下我不能同时使用它们。

Q1。我想知道我能做什么改变来解决这个问题..。

当从Intel Mac编译时,该应用程序在设备和模拟器中都能完美地编译和运行。该应用程序在苹果硅Mac电脑上编译并运行良好。只是应用程序拒绝在苹果硅Mac的iOS模拟器中编译和运行,我似乎不知道为什么。

Q2。如果没有解决办法,我想首先理解为什么会发生这种情况。

我真的不想再买旧的英特尔Mac,只是为了让事情在模拟器上工作。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-02-07 23:54:16

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

我发现GoogleWebRTC实际上要求它的源代码根据它的源代码depo使用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

如果我错了,请纠正我,但在默认情况下,运行在苹果M1硅上的Xcode似乎启动了带有arm arch类型的iOS模拟器。由于我的应用程序在英特尔Mac的模拟器上运行良好,我现在做了以下的解决方案。

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

这就是我需要做的所有工作,使我的应用程序,依赖于一个尚未完全支持arm模拟器的库,再次工作。(我相信在罗塞塔模式下启动Xcode也会在x86中运行模拟器。?)这就解释了为什么在做出上述改变之后,事情还在继续。)

很多在线消息来源(通常在M1 Mac于11月/2020发布之前发布)都谈到了“添加arm64 to Excluded Architectures",但该解决方案似乎只适用于英特尔Mac,而不适用于M1 Mac,因为我不需要做这种改变就能让事情重新开始。

当然,在Rosetta模式下运行Xcode并不是一个永久性的解决方案,Xcode会减缓lil位,但这是一个临时解决方案,如果您使用的库中的一个库在arm64模拟器中无法运行,它是一种临时解决方案。目前还没有。

票数 64
EN

Stack Overflow用户

发布于 2022-04-07 22:50:01

我找到了修复这里谢谢@Narlei

1-设置排除项目中的arm64体系结构

2-这个在你的Podfile的末尾

代码语言:javascript
复制
post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
票数 5
EN

Stack Overflow用户

发布于 2021-12-21 12:39:15

苹果不支持通过Rosetta运行Xcode模拟器。有很多虫子。

最好通过Cocoapods隔离问题库,并只将它们构建到受支持的体系结构中。

代码语言:javascript
复制
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来隔离使用此框架的代码。

代码语言:javascript
复制
#if !((arch(arm64)) && targetEnvironment(simulator))
// Not M1
#else
// M1
#endif

这里是你如何使用任何框架创建pod的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65978359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档