我正在尝试在64位Windows计算机上使用RcppGSL
,但我觉得make
变量存在一些我不理解的细微差别。
这是我尝试过的:
1. 从我在顶级R安装目录中创建的新目录中的可用二进制文件here安装 GSL。
2.更新环境变量以包含新变量LIB_GSL
以指向我解压缩GSL的文件夹
3.在新目录中创建一组文件:
- example1.cpp
- Makevars.win
以下是每个文件的样子。
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
}
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
中),因此无法找到libgsl
或libgslcblas
。如何强制执行此PKG_LIBS
传递给cppSource
而不是默认值。
我目前的解决方法是将所有内容从-L$(LIB_GSL)/lib/x64
复制到-L$(LIB_GSL)/lib
,但对该解决方案不满意。
答案 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
吗?你能调试一下吗?