M1芯片的苹果电脑使用xcode在使用cocoapods安装第三方库编译模拟器的时候可能会报错:
...building for iOS Simulator, but linking in object file built for iOS...
导致这样的原因是由于M1芯片模拟器架构是arm64架构,而Inter芯片是x86_64的架构,而我们的静态库时,会分别打包出一份针对真机(arm64)和模拟器(x86_64),然后将这两份合并成一个包后引入项目中进行使用。在Intel机型上,真机上使用arm64指令,模拟器(x86_64)中使用x86_64指令,所以不存在问题。但是在M1芯片的机型上,模拟器是以arm64运行的,显然再以x86_64运行就会出现问题。
解决方案:
1、以Rosetta模式运行Xcode
2、修改Build Settings -> Excluded Architectures选项,添加Any iOS Simulator SDK选项,并设置为arm64
备注:以Rosetta模式运行是M1机器上x86软件无法运行的解决方案,它会将x86指令转译成ARM指令运行,这种转译显然是存在性能损耗的,损耗大概在20%~30%。
装了个友盟sdk,只支持真机,然后清除,好家伙既然报错:Undefined symbols...
可以通过如下配置来解决:在 Podfile 中添加如下设置:
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
end
通过上述内容,我们知道了问题的由来,它是由于项目中存在.a或.framework,它们提供的指令集不完整导致的。Apple对于这类问题,也提供了解决方案,以Xcode13为例,在我们创建静态库时,选择真机编译出来的包只包含arm64指令,选择模拟器编译出来的会同时包含arm64和x86_64指令。我看一些网上的教程,教别人将模拟器部分的arm64移除,其实大可不必。因为要支持M1机器正常跑模拟器,模拟器必须同时包含arm64和x86_64指令。2019年的WWDC,apple提供了一种新的框架封装格式XCFramework。简单理解就是以前使用lipo合并不同指令集的包,现在则使用新的指令合并成XCFramework格式。打包成framework。XCFramework就是把两个不同指令集的framework放入了同一个文件夹(.xcframework),并生成了一个配置文件Info.plist。这样生成的XCFramework就可以完美的解决M1机器无法编译模拟器的问题。