我在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
我不知道是怎么回事。任何帮助表示赞赏。
由于
答案 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标题
对于向量和矩阵,所以如果你再次包含它们(我们的例子都没有)你可能确实得到了一个错误 - 必须有一个特定的命令才能使模板神奇工作。