我有一个应用程序,可以在旧的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。
我在网上搜索,看上去似乎有两个解决这个问题的方法。
arm64添加到Excluded ArchitecturesBuild 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,只是为了让事情在模拟器上工作。
发布于 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的模拟器上运行良好,我现在做了以下的解决方案。
Get InfoOpen using Rosetta。这就是我需要做的所有工作,使我的应用程序,依赖于一个尚未完全支持arm模拟器的库,再次工作。(我相信在罗塞塔模式下启动Xcode也会在x86中运行模拟器。?)这就解释了为什么在做出上述改变之后,事情还在继续。)
很多在线消息来源(通常在M1 Mac于11月/2020发布之前发布)都谈到了“添加arm64 to Excluded Architectures",但该解决方案似乎只适用于英特尔Mac,而不适用于M1 Mac,因为我不需要做这种改变就能让事情重新开始。
当然,在Rosetta模式下运行Xcode并不是一个永久性的解决方案,Xcode会减缓lil位,但这是一个临时解决方案,如果您使用的库中的一个库在arm64模拟器中无法运行,它是一种临时解决方案。目前还没有。
发布于 2022-04-07 22:50:01
我找到了修复这里谢谢@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发布于 2021-12-21 12:39:15
苹果不支持通过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这里是你如何使用任何框架创建pod的方法。
https://stackoverflow.com/questions/65978359
复制相似问题