Xcode13.1编译iOS真机项目链接mylib.a报arm64架构错误如何解决?
问题根因
building for iOS, but linking in object file built for iOS Simulator, for architecture arm64
从Xcode 12版本开始,苹果为M1芯片适配iOS模拟器运行能力,新增了模拟器arm64架构切片,和真机arm64架构切片是两种完全独立的二进制类型。你用Xcode 13编译的mylib.a静态库如果是合并了真机+模拟器的通用fat包,包内会同时存在两种arm64切片,Xcode链接时选择真机运行场景未正确过滤模拟器arm64切片,就会触发该报错。而Xcode 11版本不支持模拟器arm64,编译出的静态库arm64切片仅对应真机架构,因此可以正常运行。
解决方案
方案1:重新编译mylib.a静态库(推荐)
修改静态库的编译脚本,编译后将静态库的不同架构切片按场景拆分,或者用XCFramework格式打包:
- 编译时分别生成仅真机的静态包(包含armv7、arm64切片)和仅模拟器的静态包(包含x86_64、arm64切片),项目引入时根据编译场景选择对应包
- 也可以执行
xcodebuild -create-xcframework命令将两个场景的静态库打包成XCFramework格式,直接引入项目即可自动适配不同运行场景,命令示例:
xcodebuild -create-xcframework \ -library 真机编译路径/mylib.a \ -library 模拟器编译路径/mylib.a \ -output mylib.xcframework
方案2:直接修改App项目配置(临时适配,不需要重新编译静态库)
在Xcode项目的Build Settings中做如下修改:
- 找到Excluded Architectures配置项,在Any iOS Simulator SDK选项中添加
arm64,表示编译模拟器版本时排除arm64架构,只使用x86_64架构运行(M1设备会通过Rosetta转译运行,不影响功能) - 找到Build Active Architecture Only配置项,Debug模式改为
YES,Release模式改为NO - 清空项目缓存(快捷键
Command+Shift+K)后重新编译即可
内容的提问来源于stack exchange,提问作者JeremyRoche
相关产品推荐
相关产品推荐

