运行RStan教程示例失败:报错原因及解决方法咨询
问题描述
已成功安装RStan并加载该库,尝试运行RStan官方入门的「八校问题」示例,执行以下代码:
fit1 <- stan( file = "schools.stan", # Stan program data = schools_data, # named list of data chains = 4, # number of Markov chains warmup = 1000, # number of warmup iterations per chain iter = 2000, # total number of iterations per chain cores = 1, # number of cores (could use one per chain) refresh = 0 # no progress shown )
后出现如下错误:
Error in compileCode(f, code, language = language, verbose = verbose) : C:\rtools42\x86_64-w64-mingw32.static.posix\bin/ld.exe: file1c34165764a4.o:file1c34165764a4.cpp:(.text$_ZN3tbb8internal26task_scheduler_observer_v3D0Ev[_ZN3tbb8internal26task_scheduler_observer_v3D0Ev]+0x1d): undefined reference to `tbb::internal::task_scheduler_observer_v3::observe(bool)'C:\rtools42\x86_64-w64-mingw32.static.posix\bin/ld.exe: file1c34165764a4.o:file1c34165764a4.cpp:(.text$_ZN3tbb10interface623task_scheduler_observerD1Ev[_ZN3tbb10interface623task_scheduler_observerD1Ev]+0x1d): undefined reference to `tbb::internal::task_scheduler_observer_v3::observe(bool)'C:\rtools42\x86_64-w64-mingw32.static.posix\bin/ld.exe: file1c34165764a4.o:file1c34165764a4.cpp:(.text$_ZN3tbb10interface623task_scheduler_observerD1Ev[_ZN3tbb10interface623task_scheduler_observerD1Ev]+0x3a): undefined reference to `tbb::internal::task_scheduler_observer_v3::observe(bool)'C:\rtools42\x86_64-w64-mingw32.static.posix\bin/ld.exe: file1c34165764a4.o:file1c34165764a4.cpp:(.text$_ZN3tbb10interface Error in sink(type = "output") : invalid connection
运行example(stan_model, run.dontrun=T)也出现相同错误。
错误解读
这个错误是链接器(ld.exe)无法找到Intel TBB(线程构建模块)库的相关函数定义,TBB是RStan依赖的并行计算库。本质是编译Stan代码时,链接器无法正确关联到TBB库的函数实现,和PATH无关(因为链接器已经被找到并执行),大概率是RStan与Rtools版本不匹配、TBB库损坏,或是编译配置异常导致的。
解决方法
- 检查并对齐版本:运行
packageVersion("rstan")确认RStan版本,RStan 2.26及以上版本需要搭配Rtools42,若版本不匹配,卸载现有RStan后重装对应版本。 - 重置RStan编译配置:先执行
remove.packages("rstan"),删除~/.R/Makevars文件(Windows路径为C:\Users\<你的用户名>\.R\Makevars),再重新安装RStan:install.packages("rstan", repos = c("https://mc-stan.org/r-packages/", getOption("repos"))) - 临时禁用TBB并行:在运行Stan代码前执行
Sys.setenv(STAN_THREADS = FALSE),强制关闭并行编译,绕开TBB依赖问题,适合临时测试。 - 重新安装Rtools:卸载现有Rtools42,从官方渠道重新下载安装,安装时务必勾选“Add to PATH”选项,安装完成后重启R,运行
system("g++ --version")验证编译器可正常调用。 - 清理编译缓存:删除
~/.Rcpp和~/.cache/R/StanHeaders目录下的缓存文件,重启R后再尝试运行示例代码。
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

