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

use*_*927 5 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);
}
Run Code Online (Sandbox Code Playgroud)

在描述文件中我添加了:

Imports:
    Rcpp (>= 0.12.1), RcppArmadillo
LinkingTo:
    Rcpp, RcppArmadillo
Depends: RcppArmadillo
Run Code Online (Sandbox Code Playgroud)

在 NAMESPACE 文件中我添加了:

exportPattern("^[[:alpha:]]+")
useDynLib(whyNotWork)
import(RcppArmadillo)
importFrom(Rcpp, evalCpp)
Run Code Online (Sandbox Code Playgroud)

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

arma.o:arma.cpp(.text $ _zn4arma6auxlib7eig_symidns_3matideeebrns_3colit_eerkns_4baseiss_4baseis5_t0_EE ):对“ dsyev_”的不确定引用

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


一个办法:

在 src 文件夹中新建一个 .txt 文件。添加

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
Run Code Online (Sandbox Code Playgroud)

在文件中。

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

RcppArmadillo.package.skeleton()通过比较Rstudio 生成的文件和 Rstudio 生成的文件找到了解决方案

Dir*_*tel 5

你的操作系统是什么?

返回什么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> 
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这个问题值得删除;我通过谷歌发现了这个问题,它帮助我解决了我的问题。所以我想这个问题一定有一定的价值...我之前已经使用过 RcppArmadillo.package.sculpture() ,但是当在新项目上使用 RStudio 时,它也会使用 Rcpp 项目创建一个骨架,而我没有想要改变任何东西来使用犰狳。 (4认同)