Я пытаюсь использовать самую последнюю возможность пакета RcppArmadillo (версия 0.3.910.0 с R 3.0.1 и все в актуальном состоянии) для преобразования разреженной матрицы из пакета Matrix (класс "dgCMatrix") в тип sp_mat броненосец. Я использую функции "as" и "wrap" из файла "RcppArmadilloExtensions/spmat.h". К сожалению, у меня возникает ошибка компиляции при попытке создать разделяемую библиотеку .so при вызове «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.
spmat.h
нужно обновить. - person Romain Francois   schedule 20.08.2013