当通过RcppGSL编译使用Gnu Scientific Library的cpp-code时,包含一些GSL头文件会产生错误

时间:2013-11-22 10:29:08

标签: r rcpp gsl

我在R中使用RcppGSL包编译c ++代码时遇到了问题。我在Unix上(Ubuntu 13.10,安装在Oracle VM VirtualBox; R-version 3.0.2)。我设法安装了使用GSL库编译代码所需的一切(至少我是这么认为的)。以下代码没问题:

library(RcppGSL)
library(inline)

code <- ' 
#include<gsl/gsl_vector.h>
//#include<gsl/gsl_pow_int.h>

RcppGSL::vector<double> v(1);
v[0] = 1.23;
double ret = v[0];
v.free() ;
return(Rcpp::wrap(ret));
' 
foo <- cxxfunction(signature(), code, plugin = "RcppGSL", verbose = T)

这很好地编译,函数按预期返回1.23。 但是,只要我包含其他头文件而不是gsl_vector.h或gsl_matrix.h(就像上面的例子中gsl / gsl_pow_int.h未在第6行注释掉的那样),我收到以下错误消息:

Error in compileCode(f, code, language = language, verbose = verbose) : 
  Compilation ERROR, function(s)/method(s) not created! In file included from file196520f2906c.cpp:32:0:
/usr/include/gsl/gsl_pow_int.h: In function ‘SEXPREC* file196520f2906c()’:
/usr/include/gsl/gsl_pow_int.h:34:1: error: expected unqualified-id before string constant
 __BEGIN_DECLS
 ^
make: *** [file196520f2906c.o] Error 1

我不知道是怎么回事。任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:0)

我想你在这里遇到了一些基本错误。以下变体工作正常:

#include<RcppGSL.h>
#include<gsl/gsl_vector.h>
#include<gsl/gsl_pow_int.h>

// [[Rcpp::depends(RcppGSL)]]

// [[Rcpp::export]]
double foo(int ignored) {
    RcppGSL::vector<double> v(1);
    v[0] = 1.23;
    double ret = v[0];
    v.free() ;
    return ret;
}

根据快速测试:

R> sourceCpp("/tmp/so2.cpp")
R> foo(3)
[1] 1.23
R> 

有一些例子:包括一个简单但完整的包(使用向量规范) 在RcppGSL包中; Rcpp画廊也有帖子。

一般来说,包括我们的标题RcppGSL.h已经拉入了GSL标题 对于向量和矩阵,所以如果你再次包含它们(我们的例子都没有)你可能确实得到了一个错误 - 必须有一个特定的命令才能使模板神奇工作。