Rcpp :: stop()在g ++

时间:2019-06-07 12:11:37

标签: rcpp

这是一个简单的测试函数,它调用Rcpp::stop()

#include <Rcpp.h>

NumericVector dostop()
{
  Rcpp::stop("foo");
  NumericVector x(1);

  return x;
}

在OS X上使用clang时,此操作按预期执行:

> library(Rcpp)
> sourceCpp('stop.cpp')
> dostop()
Error in dostop() : foo
> 

但是,在Linux上使用g ++时,此函数会使R崩溃:

> library(Rcpp)
> sourceCpp('stop.cpp')
> dostop()
*** glibc detected *** /share/apps/R/3.3.3/lib64/R/bin/exec/R: free(): invalid pointer: 0x0000000001c29ff8 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3407c75f4e]
/lib64/libc.so.6[0x3407c78cad]
/tmp/RtmpiUT8Xb/sourceCpp-x86_64-pc-linux-gnu-1.0.1/sourcecpp_7dc862cd8f07/sourceCpp_2.so(_Z31exception_to_condition_templateIN4Rcpp9exceptionEEP7SEXPRECRKT_b+0x1da)[0x7f6fab831287]
/tmp/RtmpiUT8Xb/sourceCpp-x86_64-pc-linux-gnu-1.0.1/sourcecpp_7dc862cd8f07/sourceCpp_2.so(_Z29rcpp_exception_to_r_conditionRKN4Rcpp9exceptionE+0x29)[0x7f6fab83073d]
/tmp/RtmpiUT8Xb/sourceCpp-x86_64-pc-linux-gnu-1.0.1/sourcecpp_7dc862cd8f07/sourceCpp_2.so(sourceCpp_1_dostop+0x27d)[0x7f6fab82dd02]
/share/apps/R/3.3.3/lib64/R/lib/libR.so(+0xdc4fe)[0x7f6fb4ea04fe]
(and many more lines of similar)

这是相关的sessionInfo:

> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Workstation release 6.6 (Santiago)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Rcpp_1.0.1

问题1:我应该正确使用Rcpp::stop()吗?也就是说,像OS X一样,我是否应该能够在控制台上调用它并收到错误消息?

问题2:如果是这样,我在Linux / g ++上看到的次优行为是否有任何解决方法?

2 个答案:

答案 0 :(得分:3)

简要答案:

问题1

您正确使用了Rcpp::stop()。但是您的系统需要几年的时间,后面还有几个R版本,并且自从发布以来,我们发布了几十个(!)Rcpp版本。古老的R和编译器与当前的Rcpp结合使用的情况很少。

问题2

升级到当前版本,或坚持使用那些R和g ++版本规则制定的古老版本。也许尝试使用Rcpp版本0.12。*或0.13。*。

示例

在当前的操作系统和编译器版本上:

> Rcpp::cppFunction('double doStop(NumericVector x) { stop("foo"); return x[1]; }')
> doStop(c(1.2, 3.4))
Error in doStop(c(1.2, 3.4)) : foo
> 
> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.10

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.3.3.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.6.0 tools_3.6.0    Rcpp_1.0.1    
> 

答案 1 :(得分:1)

我最近在centos 7.3和R 3.6下遇到了这个问题。您可能正在使用gcc> = 5.1的版本以及相关的libstdc ++,而您的glibc版本是<= 2.17。

在这种情况下,最好使用-D_GLIBCXX_USE_CXX11_ABI = 0标志来编译C ++ 11代码以使其正常工作。

您可以添加

  

CXXFLAGS = -D_GLIBCXX_USE_CXX11_ABI = 0

在您的〜/ .R / Makevars文件中

并重新安装Rcpp。更改后我没有发现任何问题。