R:交互式RcppGSL使用

时间:2014-10-23 23:26:58

标签: r makefile rcpp

我正在尝试在64位Windows计算机上使用RcppGSL,但我觉得make变量存在一些我不理解的细微差别。

这是我尝试过的:
1. 从我在顶级R安装目录中创建的新目录中的可用二进制文件here安装 GSL。 2.更新环境变量以包含新变量LIB_GSL以指向我解压缩GSL的文件夹 3.在新目录中创建一组文件:
- example1.cpp
- Makevars.win

以下是每个文件的样子。

example1.cpp

example1.cpp文件是基本列规范函数,作为RcppGSL包本身中的示例包含在内:

// [[Rcpp::depends(RcppGSL)]]
#include <RcppGSL.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>

// [[Rcpp::export]]
Rcpp::NumericVector colNorm(Rcpp::NumericMatrix sM) {

    RcppGSL::matrix<double> M(sM);   // create gsl data structures from SEXP
    int k = M.ncol();
    Rcpp::NumericVector n(k);       // to store results 

    for (int j = 0; j < k; j++) {
        RcppGSL::vector_view<double> colview = gsl_matrix_column (M, j);
        n[j] = gsl_blas_dnrm2(colview);
    }

    M.free();       // important: GSL wrappers use C structure
    return n;               // return vector  
}

Makevars.win

PKG_CPPFLAGS=-I$(LIB_GSL)/include -I../inst/include 
PKG_LIBS=-L$(LIB_GSL)/lib/x64 -lgsl -lgslcblas

问题:

然而,当我sourceCpp example1.cpp文件时,它会给我以下输出:

> Rcpp::sourceCpp('example53[RcppGSL].cpp')
g++ -m64 -I"F:/PROGRA~1/r/R-31~1.1/include" -DNDEBUG -IF:/programming/r/R-3.1.1/GSL/include     -I"F:/programming/r/R-3.1.1/library/Rcpp/include" -I"F:/programming/r/R-3.1.1/library/RcppGSL/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c example53[RcppGSL].cpp -o example53[RcppGSL].o
g++ -m64 -shared -s -static-libgcc -o sourceCpp_9705.dll tmp.def example53[RcppGSL].o -LF:/programming/r/R-3.1.1/GSL/lib -lgsl -lgslcblas -LF:/PROGRA~1/r/R-31~1.1/bin/x64 -lRlapack -LF:/PROGRA~1/r/R-31~1.1/bin/x64 -lRblas -lgfortran -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LF:/PROGRA~1/r/R-31~1.1/bin/x64 -lR
f:/programming/r/rtools/gcc-4.6.3/bin/../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lgsl
f:/programming/r/rtools/gcc-4.6.3/bin/../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lgslcblas
collect2: ld returned 1 exit status
Error in Rcpp::sourceCpp("example53[RcppGSL].cpp") : 
  Error occurred building shared library.

现在,我知道我的文件实际上在-L$(LIB_GSL)/lib/x64,但链接器正在查看-L$(LIB_GSL)/lib(这也反映在我的Makevars.win中),因此无法找到libgsllibgslcblas。如何强制执行此PKG_LIBS传递给cppSource而不是默认值。

我目前的解决方法是将所有内容从-L$(LIB_GSL)/lib/x64复制到-L$(LIB_GSL)/lib,但对该解决方案不满意。

1 个答案:

答案 0 :(得分:1)

Makevars.win未使用sourceCpp()

当我在Linux上执行此操作时,事情按预期工作:

R> sourceCpp("/tmp/coln.cpp")   # where coln.cpp is what you have above
R> colNorm(matrix(1:16,4,4))
[1]  5.47723 13.19091 21.11871 29.08608
R> 

Windows上使用的内容是在程序包加载时通过程序包源中的文件R/inline.R确定的,它反映了LIB_GSL的含义。

gsl_libs <- sprintf( "-L%s/lib -lgsl -lgslcblas", LIB_GSL )可能需要更正,我们需要为您附加/x64吗?你能调试一下吗?