在Windows机器上将GSL库链接到RcppGSL

时间:2014-11-14 22:09:32

标签: rcpp

我尝试将GSL库链接到RcppGSL包。以下是我的测试功能:

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

extern "C" SEXP colNorm(SEXP sM) {
    try {   
        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() ;
        return n; // return vector  

    } catch( std::exception &ex ) {
    forward_exception_to_r( ex );

    } catch(...) { 
        ::Rf_error( "c++ exception (unknown reason)" ); 
    }
    return R_NilValue; // -Wall
}

如果以下命令不会引发编译器错误,则GSL库会成功链接到RcppGSL:

sourceCpp("colNorm.cpp")

由于我使用的是Windows机器,我需要定义环境变量,以便RcppGSL知道GSL库的位置。

我尝试编辑环境变量,但是以下编译器错误显示该包仍然无法找到GSL库:

g++ -m64 -I"C:/PROGRA~1/R/R-31~1.1/include" -DNDEBUG -I"C:/CodeLibrary/lib"/include     -               I"C:/PROGRA~1/R/R-31~1.1/library/Rcpp/include" -I"C:/PROGRA~1/R/R-31~1.1/library/RcppGSL/include"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c colNorm.cpp -o colNorm.o
g++ -m64 -shared -s -static-libgcc -o sourceCpp_38624.dll tmp.def colNorm.o -LC:/CodeLibrary/lib/lib -lgsl -lgslcblas -LC:/PROGRA~1/R/R-31~1.1/bin/x64 -lRlapack -LC:/PROGRA~1/R/R-31~1.1/bin/x64 -lRblas -lgfortran -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/PROGRA~1/R/R-31~1.1/bin/x64 -lR
c:/program files/r/r-3.1.1/rtools/gcc-4.6.3/bin/../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lgsl
c:/program files/r/r-3.1.1/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

我将环境变量LIB_GSL设置为等于"C:/CodeLibrary/lib"。在第一行中,编译器获取我的环境变量并添加/include。在第二行中,编译器添加/lib。我的C盘上不存在这些位置,也许这​​就是它无法找到库的原因。

如果有很多编译经验的人能够展示如何成功地将第三方库链接到Windows机器上的软件包,我会非常高兴。

可能需要定义更多的环境变量吗?

2 个答案:

答案 0 :(得分:3)

感谢Dirk的支持!我终于开始运行了。

必须做三件事:

1)下载local300文件夹from your link并在驱动器上分配文件夹。路径不能包含任何空格,即C:/Program Files/local300不起作用 C:/local300将有效

2)将环境变量LIB_GSL设置为等于此路径,例如LIB_GSLC:/local300

3)编译器查看LIB_GSL/lib libgsl.alibgslcblas.a(-lgsl和-lgslcblas)。但是,LIB_GSL/lib中的子文件夹为i386x64。我不知道如何更改编译器查找文件的位置,因此我从x64内部复制了所有内容并将其放入LIB_GSL/lib文件夹(上面一个文件夹级别)。

这允许 RcppGSL 编译代码而不会出错。

答案 1 :(得分:2)

查看从this page指向的R Installation and Administration manual, appendix D for Windows(在一两个链接之后)。

展开它,查看它为GSL添加标题和库的位置,并相应地调整LIB_GSL

这就是CRAN本身使用的,所以我们知道它有效。