M1芯片Xcode Rosetta构建正常 如何让xcodebuild以Rosetta模式运行
问题原因
触发该链接错误的核心原因是项目依赖的旧版Realm静态库librealmcore-ios.a未提供arm64架构的iOS Simulator切片,仅包含真机arm64、x86_64模拟器切片。以Rosetta模式启动Xcode时,构建进程会通过转译运行x86_64指令集,自动选择x86_64架构的模拟器目标完成链接,因此不会报错。
让命令行xcodebuild以Rosetta模式运行的配置方法
单命令临时生效
直接在原有xcodebuild命令前添加arch -x86_64前缀,强制命令以x86_64架构通过Rosetta转译执行,修改后的完整命令如下:
arch -x86_64 xcodebuild build -workspace "MyWorkspace.xcworkspace" -scheme "MyApp" \ -destination "generic/platform=iOS Simulator"
该方案无需修改任何全局配置,仅对当前执行的单条命令生效,适合临时构建场景。
全局默认生效
如果需要所有xcodebuild命令默认走Rosetta模式,可在shell配置文件中添加别名:
- 打开当前使用的shell配置文件,zsh用户编辑
~/.zshrc,bash用户编辑~/.bash_profile - 在文件末尾添加如下配置:
alias xcodebuild='arch -x86_64 xcodebuild'
- 执行
source ~/.zshrc(或对应shell配置文件路径)让配置立即生效
配置完成后,直接执行原来的xcodebuild命令就会自动以Rosetta转译模式运行。
验证配置是否生效
执行如下命令,如果输出架构为x86_64,说明xcodebuild已经成功运行在Rosetta转译模式下:
xcodebuild -version && arch
执行原构建命令不再出现开头的ld链接错误,即代表配置正常。
长期根治方案(推荐)
依赖Rosetta转译构建属于临时兼容方案,苹果后续会逐步移除Rosetta支持,建议从根源解决架构不匹配问题:
- 升级项目依赖的Realm版本至v10.10.0及以上,该版本开始Realm官方正式提供arm64架构的iOS Simulator切片,升级后无需开启Rosetta,原生arm64模式下的Xcode、xcodebuild均可正常完成构建
- 如果暂时无法升级Realm版本,可直接在项目Build Settings中修改配置,无需转译整个Xcode进程:找到
Excluded Architectures配置项,针对Any iOS Simulator SDK添加arm64到排除架构列表,构建模拟器目标时会自动选择x86_64架构完成编译链接,效果与Rosetta模式完全一致。
内容的提问来源于stack exchange,提问作者Michael Ozeryansky
相关产品推荐
相关产品推荐

