Apple Silicon Mac上iOS Simulator为何编译x86_64?求arm64编译方案
问题解答
疑问解答
1. 为何Apple Silicon Mac编译arm64模拟器时出现x86_64链接错误?
Google MLKit的预编译二进制包未包含arm64 iOS模拟器架构,但Pod配置或Xcode默认设置仍保留了x86_64的编译目标。当你尝试编译arm64模拟器时,Xcode找不到对应的arm64模拟器库,会尝试 fallback 链接x86_64版本,最终因架构不匹配报错。
2. 为何arm64设备编译正常,模拟器却报错?Rosetta模式为何能运行?
- 设备端的arm64(iOS arm64)和模拟器的arm64(iOS Simulator arm64)是两个不同的编译目标,MLKit提供了设备端的arm64库,但未提供模拟器版本。
- Rosetta模式下,Xcode会以x86_64架构编译模拟器目标,而MLKit有对应的x86_64模拟器库,因此能正常链接运行;非Rosetta模式下,Xcode默认用arm64编译模拟器,找不到匹配的库就会报错。
解决方案:强制仅编译arm64架构
针对Xcode 15.0.1,按以下步骤操作:
1. 修改项目和Target的Build Settings
- 打开项目根目录,进入Build Settings标签页
- 搜索
Architectures:- 设置
Architectures为arm64(删除其他架构,只保留这一项) - 若能找到
Valid Architectures,同样设置为arm64
- 设置
- 搜索
Excluded Architectures:- 在Debug和Release配置下,添加
x86_64(确保编译时排除该架构)
- 在Debug和Release配置下,添加
- 搜索
Build Active Architecture Only,设置为YES(仅编译当前选中的架构)
2. 修改Podfile强制Pods适配arm64
在Podfile末尾添加以下代码:
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # 排除模拟器的x86_64架构 config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'x86_64' # 强制Pods仅编译arm64 config.build_settings['ARCHS'] = 'arm64' config.build_settings['VALID_ARCHS'] = 'arm64' end end end
执行pod install重新安装依赖。
3. 清理缓存并重新编译
- 执行
rm -rf ~/Library/Developer/Xcode/DerivedData删除Xcode缓存 - 按下
Shift + Cmd + K清理Build Folder - 重新选择arm64模拟器编译运行
注意:如果Google MLKit后续更新了支持arm64模拟器的版本,建议优先升级库版本,上述方案属于临时适配手段。
内容的提问来源于stack exchange,提问作者Can Poyrazoğlu
相关产品推荐
相关产品推荐

