J'essaie d'utiliser les capacités très récentes du paquet RcppArmadillo (version 0.3.910.0 avec R 3.0.1 et tout ce qui est à jour) pour convertir une matrice éparse du paquet Matrix (classe "dgCMatrix") au type sp_mat d'armadillo. J'utilise les fonctions "as" et "wrap" du fichier "RcppArmadilloExtensions/spmat.h". Malheureusement, je rencontre une erreur de compilation lorsque j'essaie de créer la bibliothèque partagée .so en invoquant "R CMD INSTALL myRpackage".
Voici un exemple minimal pour reproduire l'erreur :
- J'ai créé un paquet vide avec RcppArmadillo.package.skeleton()
- J'ai défini 2 fichiers .cpp avec leurs en-têtes .h correspondants pour effectuer la somme et le produit de matrices éparses importées de R, comme suit :
file "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
Fichier "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) ;
}
Fichier "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
Fichier "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) ;
}
Ensuite, en exécutant $ R CMD INSTALL anRpackage $, le compilateur crée successivement les fichiers ".o" mais j'obtiens l'erreur ld suivante :
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’
Alors, qu'est-ce que je fais de mal ? Désolé si c'est une question stupide... En tout cas, merci à tous les gars qui font un si bon travail avec armadilllo/RcppArmadillo, et pour votre aide.
J.