我尝试将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机器上的软件包,我会非常高兴。
可能需要定义更多的环境变量吗?
答案 0 :(得分:3)
感谢Dirk的支持!我终于开始运行了。
必须做三件事:
1)下载local300文件夹from your link并在驱动器上分配文件夹。路径不能包含任何空格,即C:/Program Files/local300
不起作用
C:/local300
将有效
2)将环境变量LIB_GSL
设置为等于此路径,例如LIB_GSL
至C:/local300
3)编译器查看LIB_GSL/lib
libgsl.a
和libgslcblas.a
(-lgsl和-lgslcblas)。但是,LIB_GSL/lib
中的子文件夹为i386
和x64
。我不知道如何更改编译器查找文件的位置,因此我从x64
内部复制了所有内容并将其放入LIB_GSL/lib
文件夹(上面一个文件夹级别)。
这允许 RcppGSL 编译代码而不会出错。
答案 1 :(得分:2)
查看从this page指向的R Installation and Administration manual, appendix D for Windows(在一两个链接之后)。
展开它,查看它为GSL添加标题和库的位置,并相应地调整LIB_GSL
。
这就是CRAN本身使用的,所以我们知道它有效。