RcppArmadillo“ Windows平台下的inDL(x,as.logical(local),as.logical(now),...)中的错误”

时间:2018-10-11 12:35:12

标签: r rcpp armadillo

我有一些用Rcpp和RcppArmadillo编写的函数,像这样


example.cpp:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
#include <iostream>
#include <math.h>


using namespace Rcpp;
// using namespace RcppArmadillo;
using namespace arma;
using namespace std;


// [[Rcpp::export]]
double inner1(NumericVector x, NumericVector y) {
  int K = x.length() ;
  double ip = 0 ;
  for (int k = 0 ; k < K ; k++) {
    ip += x(k) * y(k) ;
  }
  return(ip) ;
}



// [[Rcpp::export]]
mat multiply2(mat A, mat B) {
  return A * B;
}

然后我使用Rcpp::sourceCpp('example.cpp'),它在Ubuntu下运行良好。

(我之前运行过library(Rcpp)library(RcppArmadillo)

但是,当我移至Windows平台时,RStudio会抛出一个错误消息:

> Rcpp::sourceCpp('R:/example.cpp')
Error in inDL(x, as.logical(local), as.logical(now), ...) : 
  unable to load shared object 'C:/Users/[Username]/AppData/Local/Temp/RtmpG6H80X/sourceCpp-x86_64-w64-mingw32-0.12.19/sourcecpp_40b04b2c2bcf/sourceCpp_4.dll':
  LoadLibrary failure: The specified procedure could not be found.

我发现关键问题在于矩阵乘法。由于我尝试删除第二个功能multiply2。然后可以在Windows下成功编译其余代码。

example2.cpp


#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
#include <iostream>
#include <math.h>


using namespace Rcpp;
// using namespace RcppArmadillo;
using namespace arma;
using namespace std;


// [[Rcpp::export]]
double inner1(NumericVector x, NumericVector y) {
  int K = x.length() ;
  double ip = 0 ;
  for (int k = 0 ; k < K ; k++) {
    ip += x(k) * y(k) ;
  }
  return(ip) ;
}

我尝试了其他一些代码,发现在代码中使用矩阵乘法*时会发生此错误。

那么,为什么Windows平台下RcppArmadillo中的矩阵乘法失败?

1 个答案:

答案 0 :(得分:2)

与编译器苦苦挣扎了很长时间之后,我发现关键是BLAS库没有在Windows系统环境路径中正确设置。

简而言之,解决方案是:

  1. Here下载OpenBLS的预编译二进制软件包(不要尝试在Windows下编译最新版本,我已经花了很多时间)
  2. Exactor OpenBLAS-v0.2.19-Win64-int32.zipC:\LIBS\OpenBLAS-v0.2.15-Win64-int32之类的地方
  3. C:\LIBS\OpenBLAS-v0.2.15-Win64-int32\bin添加到您的PATH
  4. [可选]创建一个名为BLAS_LIBS的新环境变量,其值为C:\LIBS\OpenBLAS-v0.2.15-Win64-int32\bin
  5. 重新启动RStudio,问题已解决。

我通过RcppArmadillo从源代码安装install.packages("RcppArmadillo", type = "source")找到了该解决方案,这次RStudio在编译期间抛出了相同的错误,因此安装失败。

但是,如果我只使用install.packages("RcppArmadillo"),则RStudio将安装RcppArmadillo的二进制版本,因此我没有收到关于缺少BLAS的反馈。