我正在尝试使用 RcppArmadillo 包的最新功能(版本 0.3.910.0,R 3.0.1 和最新版本)将稀疏矩阵从 Matrix 包(类“dgCMatrix”)转换为 sp_mat 类型犰狳。我正在使用文件“RcppArmadilloExtensions/spmat.h”中的“as”和“wrap”函数。不幸的是,我在尝试创建共享库时遇到编译错误。所以在调用“R CMD INSTALL myRpackage”时。
这是重现错误的最小示例:
- 我用 RcppArmadillo.package.skeleton() 创建了一个空包
- 我定义了 2 个 .cpp 文件及其相应的头文件 .h 来执行从 R 导入的稀疏矩阵的求和和乘积,如下所示:
文件“arma_sp_sum.h”
#ifndef _anRpackage_ARMA_SP_SUM_H
#define _anRpackage_ARMA_SP_SUM_H
#include <RcppArmadilloExtensions/spmat.h>
RcppExport SEXP arma_sp_prod(SEXP SPMAT) ;
#endif
文件“arma_sp_sum.cpp”
#include "arma_sp_sum.h"
using namespace Rcpp ;
SEXP arma_sp_sum(SEXP SPMAT){
arma::sp_mat m1 = Rcpp::as<arma::sp_mat>(SPMAT) ;
arma::sp_mat m2 = Rcpp::as<arma::sp_mat>(SPMAT) ;
arma::sp_mat res = m1 + m2;
return Rcpp::wrap(res) ;
}
文件“arma_sp_prod.h”
#ifndef _anRpackage_ARMA_SP_PROD_H
#define _anRpackage_ARMA_SP_PROD_H
#include <RcppArmadilloExtensions/spmat.h>
RcppExport SEXP arma_sp_prod(SEXP SPMAT) ;
#endif
文件“arma_sp_prod.cpp”
#include "arma_sp_prod.h"
using namespace Rcpp ;
SEXP arma_sp_prod(SEXP SPMAT){
arma::sp_mat m1 = Rcpp::as<arma::sp_mat>(SPMAT) ;
arma::sp_mat m2 = Rcpp::as<arma::sp_mat>(SPMAT) ;
arma::sp_mat res = m1 * m2;
return Rcpp::wrap(res) ;
}
然后,在运行 $ R CMD INSTALL anRpackage $ 时,编译器会连续创建“.o”文件,但出现以下 ld 错误:
ld: duplicate symbol arma::SpMat<double> Rcpp::as<arma::SpMat<double> >(SEXPREC*)in arma_sp_sum.o and arma_sp_prod.o for architecture x86_64
collect2: ld returned 1 exit status
make: *** [anRpackage.so] Error 1
ERROR: compilation failed for package ‘anRpackage’
那么我做错了什么?对不起,如果这是一个愚蠢的问题......无论如何,感谢所有在犰狳/RcppArmadillo 方面做得如此出色的人,并感谢您的帮助。
J。