[Rcpp-devel] problem compiling with const in RcppEigen

M A markoilcan at gmail.com
Thu Jan 31 18:01:21 CET 2013


I am compiling some source code using sourceCpp and getting a
compiling failure when the source has the line with the const keyword
but no failure when it does not, in the below source.

// file: minimaltest.cpp
// [[Rcpp::depends(RcppEigen)]]

#include <RcppEigen.h>
#include <Rcpp.h>

typedef Eigen::Map<Eigen::VectorXd> MapVecd;
//typedef Eigen::Map<Eigen::MatrixXd> MapMatd; // This one works
typedef Eigen::Map<const Eigen::MatrixXd> MapMatd; // This one fails

// [[Rcpp::export]]
Eigen::VectorXd testfunc(const MapVecd ytrait, MapMatd xmat) {

    return ytrait;
}

This is the error:

> sourceCpp("minimaltest.cpp")
g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include
-I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG
-I/usr/local/include
-I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include"
-I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include"
  -fPIC  -g -O2  -c minimaltest.cpp -o minimaltest.o
Error in sourceCpp("minimaltest.cpp") :
  Error 1 occurred building shared library.
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/internal/Exporter.h:
In constructor ‘Rcpp::traits::Exporter<T>::Exporter(SEXPREC*) [with T
= Eigen::Map<const Eigen::Matrix<double, -0x00000000000000001,
-0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,
0, Eigen::Stride<0, 0> >]’:
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/as.h:67:
  instantiated from ‘T Rcpp::internal::as(SEXPREC*,
Rcpp::traits::r_type_generic_tag) [with T = Eigen::Map<const
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,
-0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0>
>]’
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/as.h:112:
  instantiated from ‘T Rcpp::as(SEXPREC*) [with T = Eigen::Map<const
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,
-0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0>
>]’
minimaltest.cpp:35:   instantiated from here
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/Rcpp/internal/Exporter.h:31:
error: no matching function for call to ‘Eigen::Map<const
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,
-0x00000000000000001, -0x00000000000000001>, 0, Eigen::Stride<0, 0>
>::Map(SEXPREC*&)’
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:164:
note: candidates are: Eigen::Map<MatrixType, MapOptions,
StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,
MapOptions, StrideType>,
(Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,
MapOptions, StrideType> >::has_write_access ?  WriteAccessors :
ReadOnlyAccessors)>::PointerType, typename
Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,
StrideType> >::Index, typename
Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,
StrideType> >::Index, const StrideType&) [with PlainObjectType = const
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,
-0x00000000000000001, -0x00000000000000001>, int MapOptions = 0,
StrideType = Eigen::Stride<0, 0>]
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:151:
note:                 Eigen::Map<MatrixType, MapOptions,
StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,
MapOptions, StrideType>,
(Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,
MapOptions, StrideType> >::has_write_access ?  WriteAccessors :
ReadOnlyAccessors)>::PointerType, typename
Eigen::internal::traits<Eigen::Map<PlainObjectType, MapOptions,
StrideType> >::Index, const StrideType&) [with PlainObjectType = const
Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001, 0,
-0x00000000000000001, -0x00000000000000001>, int MapOptions = 0,
StrideType = Eigen::Stride<0, 0>]
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:139:
note:                 Eigen::Map<MatrixType, MapOptions,
StrideType>::Map(typename Eigen::MapBase<Eigen::Map<PlainObjectType,
MapOptions, StrideType>,
(Eigen::internal::accessors_level<Eigen::Map<PlainObjectType,
MapOptions, StrideType> >::has_write_access ?  WriteAccessors :
ReadOnlyAccessors)>::PointerType, const StrideType&) [with
PlainObjectType = const Eigen::Matrix<double, -0x00000000000000001,
-0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,
int MapOptions = 0, StrideType = Eigen::Stride<0, 0>]
/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RcppEigen/include/Eigen/src/Core/Map.h:106:
note:                 Eigen::Map<const Eigen::Matrix<double,
-0x00000000000000001, -0x00000000000000001, 0, -0x00000000000000001,
-0x00000000000000001>, 0, Eigen::Stride<0, 0> >::Map(const
Eigen::Map<const Eigen::Matrix<double, -0x00000000000000001,
-0x00000000000000001, 0, -0x00000000000000001, -0x00000000000000001>,
0, Eigen::Stride<0, 0> >&)
make: *** [minimaltest.o] Error 1

Here is my session info:
> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] RcppEigen_0.3.1.2 Matrix_1.0-9      lattice_0.20-10   Rcpp_0.10.2

loaded via a namespace (and not attached):
[1] grid_2.15.2  tools_2.15.2

Note that the g++... portion works fine on the command line, so I
guess the failure is somewhere in the building of the library. Of
course I can get around this by not using the const keyword, but why
is there a problem and what is the right fix?

Thanks,
Mark A


More information about the Rcpp-devel mailing list