在Rstudio中使用RcppArmadillo制作R包符合错误“对dsyev的未定义引用”

时间:2015-12-09 18:38:31

标签: r rcpp

我试图找出一个错误,阻止我使用RcppArmadillo制作R包“whyNotWork”。该包只包含一个带有一个简单函数的.cpp文件,该函数返回矩阵的特征值:

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

// [[Rcpp::export]]
arma::vec getEigenValues(arma::mat M) 
{
    return arma::eig_sym(M);
}

在DESCRIPTION文件中,我添加了:

Imports:
    Rcpp (>= 0.12.1), RcppArmadillo
LinkingTo:
    Rcpp, RcppArmadillo
Depends: RcppArmadillo

在NAMESPACE文件中,我添加了:

exportPattern("^[[:alpha:]]+")
useDynLib(whyNotWork)
import(RcppArmadillo)
importFrom(Rcpp, evalCpp)

如果我没有尝试创建一个包,该函数可以正常工作 - “源”按钮将成功加载该函数并且它可以正常工作。但是,在制作包时,点击“Build&amp; Reload”按钮会出现以下错误:

  

arma.o:arma.cpp($的.text _ZN4arma6auxlib7eig_symIdNS_3MatIdEEEEbRNS_3ColIT_EERKNS_4BaseIS5_T0_EE [_ZN4arma6auxlib7eig_symIdNS_3MatIdEEEEbRNS_3ColIT_EERKNS_4BaseIS5_T0_EE] + 0x28d):   对`dsyev _'

的未定义引用

我用谷歌搜索“dsyev”,它似乎与LAPCAK有关..

解决方案:

src文件夹中的新.txt文件。添加

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

在文件中。

将txt文件重命名为Makevars.win(如果它不是Windows系统,则不是.win)。包装成功。

通过比较RcppArmadillo.package.skeleton()生成的文件和Rstudio

生成的文件,找到解决方案

1 个答案:

答案 0 :(得分:4)

您的操作系统是什么?

R CMD config LAPACK_LIBS返回什么?

您是自己构建R还是下载了二进制文件?

在大多数系统(Linux,OS X,...)上,R将使用外部LAPACK库。在Windows上,它可能使用自己的(减少的)LAPACK副本,但缺少某些功能。

对于它的价值,你的程序在我的系统上使用外部LAPACK库构建得很好:

R> sourceCpp("/tmp/arma_sym.cpp")
R> v <- 1:4; getEigenValues(v %*% t(v))  
             [,1]
[1,] -2.33587e-15
[2,]  0.00000e+00
[3,]  2.33587e-15
[4,]  3.00000e+01
R>