Apple M1芯片MacOS Monterey/Ventura下Rstan报错‘unknown target CPU 'apple-m1'’求助
解决方案:M1 MacBook Pro(OSX 12)下rstan编译错误修复
核心问题分析
你的错误根源在于架构不匹配和编译选项冲突:
~/.R/Makevars中强制指定了-arch x86_64,但M1是arm64架构,导致clang编译时出现目标CPU不兼容的错误。- R调用的clang工具链可能和终端版本/架构不一致(比如R通过Rosetta运行,使用x86_64版本clang,而终端是arm64版本),因此终端能识别
apple-m1,但R调用的clang无法识别。
步骤1:重置并修改~/.R/Makevars
先备份原文件,再创建适配M1架构的配置:
- 终端执行备份命令:
cp ~/.R/Makevars ~/.R/Makevars.bak - 新建或替换
~/.R/Makevars内容为:
说明:# 适配M1 arm64架构的rstan编译选项 CXX14FLAGS=-O3 -mcpu=apple-m1 -mtune=apple-m1 -ftemplate-depth-256 CPPFLAGS=-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include # 显式指定clang编译器,确保工具链一致性 CC=clang CXX=clang++- 移除
-arch x86_64,避免强制使用x86架构 - 用
-mcpu=apple-m1替代-march=native,明确指定目标CPU,避免自动检测冲突 - 显式指定clang编译器,确保R调用的工具链和终端一致
- 移除
步骤2:确认R的架构为arm64
如果R是x86_64版本(通过Rosetta运行),会和M1工具链冲突:
- 打开R/RStudio,执行以下命令查看架构:
若输出为Sys.getenv("R_ARCH")/x86_64,说明当前运行的是x86版本的R - 解决方法:
- 卸载现有x86版本的R,从CRAN官方渠道下载适配Apple Silicon的arm64版本R
- 打开RStudio时,取消右键菜单中的「使用Rosetta打开」选项,确保RStudio以arm64模式运行
步骤3:修复unserialize连接错误
若编译成功但出现Error in unserialize(socklist[[n]]),通常由以下原因导致:
- 架构不匹配:确保步骤2中R为arm64版本,且
Makevars未强制x86架构 - 内存不足:关闭其他高内存占用应用,调用
stan()时设置合理的cores参数(不超过CPU核心数)
验证修复
- 重启R/RStudio
- 运行简单的rstan测试代码验证:
若能正常编译运行,则问题已解决library(rstan) example(stan_model, run.dontrun = TRUE)
内容的提问来源于stack exchange,提问作者bill.lihan
相关产品推荐
相关产品推荐

