[Rcpp-devel] C++11 in Windows R package
edd at debian.org
Thu May 29 21:28:47 CEST 2014
On 29 May 2014 at 20:41, Matt D. wrote:
| On 5/28/2014 23:58, Matteo Fasiolo wrote:
| Dear Rcpp developers,
| I am working on a package which uses Rcpp/RcppArmadillo, OpenMP and C++11.
| Everything works fine under Linux: the package passes R CMD check
| while tests and vignettes work fine.
| I uploaded the package on win-builder, but I keep getting the error at the
| I have included the line CXX_STD = CXX11 in makefile.win as written in
| R extensions". I have read comments on SO regarding Rtools not supporting
| many C++11
| features. Is that the reason for the error or am I missing something?
| Hi, it's fixable! :-)
| I remember having to do that for RcppArmadillo 0.4.200.0.
| Just updated to RcppArmadillo 0.4.300.0 and the issue still appears.
| There are two reasons (and thus two quick fixes):
| - "\RcppArmadillo\include\armadillo_bits\compiler_setup.hpp" forces the C++11
| mode even when the compiler only supports experimental C++0x (this explains
| your diagnostic messages);
| a simple fix is to comment out the offending preprocessor directives -- as in
| the following:
| //#if defined(__GXX_EXPERIMENTAL_CXX0X__)
| // #undef ARMA_USE_CXX11
| // #define ARMA_USE_CXX11
Ack. I need to coordinate with Conrad to make this a little less binding. He
is tad busy right now but we should get there. Maybe (for now) just using
#if defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(_WIN32)
to protect ourselves from g++ 4.6.* is good enough?
| - "\RcppArmadillo\include\RcppArmadilloConfig.h" tries to detect Windows
| environment and fails (as already noticed).
| IMHO it fails for a good reason -- the guaranteed define is `_WIN32` and not
| // As Dirk noted the `WIN32` attempt is due to the choice made by R
| implementers in the past. This doesn't change the fact that this choice is
| wrong, IMHO -- the reason is that only the leading underscore (with certain
| capitalization variants, also other names with `_t`, etc.) is guaranteed to
| result in a name that is an implementation-reserved choice in C and C++. OTOH,
| names like `WIN32` are not reserved and the users (client code) may feel free
| to (re)define them as they like -- in particular, Windows users may freely `#
| undef` it, while POSIX users may freely `#define` it -- and there's no reason
| to say they would be "wrong" in doing so ;-)
| // See:
| // http://stackoverflow.com/questions/662084/
| // http://stackoverflow.com/questions/228783/
| A better fix may be to fix the offending line in "RcppArmadilloConfig.h",
| perhaps to something like the following:
| #if defined(WIN32) || defined(_WIN32)
Yes, that is simpler than what I had committed in the meantime -- will adjust.
| After applying these fixes, an example from http://cran.r-project.org/web/
| packages/Rcpp/vignettes/Rcpp-attributes.pdf (p.6; BTW, there's a small typo:
| using-directive statement is missing a semicolon terminator) using
| RcppArmadillo compiles without issues.
Thanks, added the semicolon too.
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
More information about the Rcpp-devel