Xcode错误'为iOS模拟器构建,但在为iOS构建dylib中链接..用于架构arm64'来自Apple Silicon M1 Mac

xj3cbfub  于 2022-12-05  发布在  iOS
关注(0)|答案(5)|浏览(859)

我有一个应用程序,它在物理设备和iOS模拟器中使用英特尔处理器的旧Mac电脑上编译和运行良好。
同样的应用程序也可以在配备M1处理器的较新Apple Silicon Mac上编译并运行良好,物理iPhone设备,它拒绝为iOS模拟器编译。
如果没有模拟器的支持,调试的周转时间会变得很长,所以我试图解决这个问题。更不用说Xcode预览功能也不工作,这很烦人。
我遇到的第一个错误,没有做任何更改(但从英特尔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,arm 64应该是支持的,所以我很困惑为什么会抛出上述错误。正如我之前所说,它在真实的设备中编译得很好,我相信它运行在arm 64上。
根据文件..
此单元包含二进制形式的WebRTC iOS SDK。它是一个动态库,包含armv7、arm 64和x86_64切片。不支持位码。我们当前提供的API仅为Objective C。
我在网上搜索了一下,it appears似乎有2个解决这个问题的方法。
1.第一种方法是将arm64Excluded Architectures相加
1.第二个选项是为Release构建标记Build Active Architecture Only
我不完全明白,如果以上是必要的,即使当我编译我的应用程序在M1 Mac上运行在arm 64架构下,因为解决方案似乎只适用于不支持arm 64模拟器的英特尔Mac,至于英特尔Mac,模拟器可能已经在x86_64中运行,而不是与arm 64,所以解决方案#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或arm 64中运行没有太多的见解,所以我无法深入调查这个问题。
我的结论是GoogleWebRTC由于某种原因不能编译成在iOS模拟器中运行arm64(与its doc所说的不同),lottie-ios也不能编译成在iOS模拟器中运行x86_64
Q1.我想知道我可以做哪些更改来解决此问题...
当从Intel Mac编译时,该应用程序在设备和模拟器中编译和运行都很完美。当从Apple Silicon Mac编译时,该应用程序在设备中编译和运行都很好。只是该应用程序拒绝从Apple Silicon Mac在iOS模拟器中编译和运行,我似乎找不出原因。
问题2:如果没有可用的解决方案,我想首先了解为什么会发生这种情况。
我真的不希望再买旧的英特尔Mac只是为了让事情在模拟器中工作。

qybjjes1

qybjjes11#

回答我自己的问题,希望能帮助其他有类似问题的人。(直到另一个用户添加了一个好的答案)
我发现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
如果我说错了,请纠正我,但默认情况下,运行在Apple M1芯片上的Xcode似乎会启动arm arch类型的iOS模拟器。由于我的应用在Intel Mac的模拟器上运行良好,我现在做了以下工作。
1.退出Xcode。
1.前往Finder并打开应用程序文件夹。
1.右键单击Xcode应用程序,选择Get Info
1.在“Xcode信息窗口”中检查Open using Rosetta
1.打开Xcode并再次尝试运行。
这就是我需要做的一切,让我的应用程序再次工作,它依赖于一个库,尚未完全支持的手臂模拟器,(我相信在Rosetta模式下启动Xcode运行模拟器在x86以及......这解释了为什么事情是工作后,作出上述变化)
很多在线来源(经常在2020年11月M1 Mac发布之前发布)都在谈论“将Arm64添加到Excluded Architectures“,但该解决方案似乎只适用于Intel Mac,而不是M1 Mac,因为我不需要做出这种改变就能让事情再次正常工作。
当然,在Rosetta模式下运行Xcode并不是一个永久的解决方案,Xcode会减慢lil bit的速度,但它是一个临时的解决方案,可以让事情继续下去,以防您正在使用的库之一在arm64模拟器中无法运行。

9jyewag0

9jyewag02#

我找到了修复here谢谢@Narlei
1-在项目中设置排除arm 64架构

2-这位于您的播客文件的末尾

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
ubbxdtey

ubbxdtey3#

苹果不支持通过Rosetta运行Xcode模拟器,有很多bug。
最好通过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

P.S.这里是你如何create pod with any framework

new9mtju

new9mtju4#

退出Xcode。前往Finder并打开“应用程序文件夹”。右键单击Xcode应用程序,选择“显示简介”。在“Xcode简介窗口”中选中“使用Rosetta打开”。打开Xcode并尝试再次运行。enter image description here

fbcarpbf

fbcarpbf5#

我在M2硅macbook上运行Xcode,我正在构建的应用程序有多个模块,这些模块依赖于没有配置为在arm 64模拟器上构建的cocopod,因此出现了问题。
在Rosetta中运行Xcode可以让应用程序构建到Sim上,但这只是第一次构建,一切都运行得很慢。当我随后重新构建并再次运行应用程序时,它不会将进程附加到Sim上!我会在Xcode上看到黑屏和死亡转轮,这相当烦人。我不得不找到一个不同的解决方案,我将在下面解释。
点击@Michael Long提供的链接
https://blog.sudeium.com/2021/06/18/build-for-x86-simulator-on-apple-silicon-macs/
我不得不为我的应用程序中的每个项目/模块将“任何iOS模拟器SDK”的“架构”(不是排除选项,只是一般的Arch)设置为“x86_64”。另外,确保“仅构建活动架构”设置为“否”也很重要。然后我转到我的podfile并添加了以下内容:

config.build_settings['ARCHS[sdk=iphonesimulator*]'] = 'x86_64'

到podfile的安装后部分。如果你发现在构建过程中找不到某些内部模块,你就错过了上面描述的该模块的构建设置。

相关问题