R6类中调用Rcpp函数开发R包时Makevars缺失及编译报错问询
问题原因
该报错属于BLAS线性代数库链接缺失,和未正确配置Makevars/Makevars.win文件直接相关,同时同时依赖RcppArmadillo和RcppEigen的配置也存在遗漏点。
解决步骤
1. 手动补充src目录下的编译配置文件
在你的RegressionTool/src目录下分别新建两个配置文件:
- 针对Linux/macOS的
Makevars文件,内容如下:
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
- 针对Windows的
Makevars.win文件,内容如下:
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
上述配置会让R编译时自动链接自带的BLAS和LAPACK线性代数库,直接解决dsyrk_未定义的链接报错。
2. 核对DESCRIPTION文件配置
确认你的DESCRIPTION文件中包含以下字段,无需额外配置RcppEigen的系统依赖(Eigen是纯头文件实现的库):
Depends: R (>= 4.1.0), Rcpp Imports: RcppArmadillo, RcppEigen LinkingTo: Rcpp, RcppArmadillo, RcppEigen
3. 按顺序重新执行编译流程
清空之前生成的中间编译文件后,按以下顺序执行命令:
- 将R控制台的工作目录切换到
RegressionTool包的父目录 - 执行
Rcpp::compileAttributes()生成函数导出声明 - 执行
roxygen2::roxygenize(roclets = c("rd", "namespace")),补充namespace的roclet自动处理函数导出规则 - 执行
devtools::install()或R CMD INSTALL RegressionTool完成包安装
补充说明
RcppArmadillo的package.skeleton函数默认不会自动生成Makevars系列文件,属于正常设计,手动补充即可。如果仅需要高性能矩阵乘法能力,也可以仅保留Eigen实现,减少包的依赖体积。
内容的提问来源于stack exchange,提问作者Nicola Barraco
相关产品推荐
相关产品推荐

