Dirk,

OK, I’ll try again.  I’ll respond out of order:

c)  There are no run instructions.  This issue (as stated in all of my posts on 
this issue) is that GCC will not load the .so from the MWE because 
standard_delete_finalizer is missing.  Compiling with clang++ does not have 
this issue, which brings us to…

a)  Again, the issue here is GCC vs clang, and [[Rcpp::plugins(“cpp11”)]] (and 
CXX_STD = CXX11 in a Makevars.in) have an unfortunate side-effect on all the 
Linux (Ubuntu) systems that I use.  They over-ride the definition of CXX in 
~/.R/Makevars, which means I can only use GCC.  I’m assuming that this is an R 
issue, but it is important to reproducing this example, which is the raison 
d’etre for the R scripts in the gist…


For example, here is my ~/.R/Makevars:

cat ~/.R/Makevars
CXX=ZeppelinRules

Now, let’s see what happens with Rcpp::plugins(“cpp11”):

Rscript -e 'library(Rcpp)' -e 'sourceCpp(code="// 
[[Rcpp::plugins(\"cpp11\")]]\n// [[Rcpp::export]]\nvoid foo(){}",verbose=TRUE)'

The relevant output is:

g++ -std=c++11 -I/usr/share/R/include -DNDEBUG    
-I"/usr/local/lib/R/site-library/Rcpp/include" -I"/tmp/Rtmpqaq1Pj"    -fpic  -g 
-O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat 
-Werror=format-security -D_FORTIFY_SOURCE=2 -g -c file52eccfd254e.cpp -o 
file52eccfd254e.o
g++ -std=c++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro 
-o sourceCpp_61207.so file52eccfd254e.o -L/usr/lib/R/lib -lR

So, the plugin over-rides my Makevars, and without it we learn that Zeppelin is 
not a C++ compiler:

Rscript -e 'library(Rcpp)' -e 'sourceCpp(code="// [[Rcpp::export]]\nvoid 
foo(){}",verbose=TRUE)’

The relevant output is:

ZeppelinRules -I/usr/share/R/include -DNDEBUG    
-I"/usr/local/lib/R/site-library/Rcpp/include" -I"/tmp/Rtmpblhfp9"    -fpic  -g 
-O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat 
-Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c file530e5ce6ddd1.cpp -o 
file530e5ce6ddd1.o
/bin/bash: ZeppelinRules: command not found

So, my original gist was correct, because it is a MWE, and sets the cpp11 
properly, in the sense that it allows me to properly select my c++ compiler via 
~/.R/Makevars and avoids the side-effect described above:

Sys.setenv("PKG_CXXFLAGS" = "-std=c++11”)

Finally, here’s an all-in 1 response to:

b.) build instructions

VERSION1

This gives the following error using all combos of G++ 4.7,4.8,4.9 and Rcpp 
0.11.4 through 0.11.6 on several different Linux systems (Ubuntu servers, 
mostly 14.04, and our HPC system which is some custom distro…):

Error in dyn.load("/tmp/RtmpoMjBFt/sourcecpp_53761e3a356a/sourceCpp_4629.so") : 
  unable to load shared object 
'/tmp/RtmpoMjBFt/sourcecpp_53761e3a356a/sourceCpp_4629.so':
  /tmp/RtmpoMjBFt/sourcecpp_53761e3a356a/sourceCpp_4629.so: undefined symbol: 
_ZN4Rcpp25standard_delete_finalizerISt5tupleIIiiEEEEvPT_
Calls: sourceCpp -> source -> withVisible -> eval -> eval -> dyn.load

(With clang++, all is cool, but you need to change your CXX yourself to see 
that, so edit your own ~/.R/Makevars, and don’t use Rcpp::plugins, at least on 
Ubuntu…)

The code is:

library(Rcpp)
Sys.setenv("PKG_CXXFLAGS" = "-std=c++11")
sourceCpp(code="#include <Rcpp.h>
#include <tuple>

#ifdef USE_DELETER
namespace Rcpp {
  template<>
  inline void standard_delete_finalizer<std::tuple<int,int> >( 
std::tuple<int,int> * t ) { delete t; }
}
#endif

namespace foo {
  using tuple_t = std::tuple<int,int>;
  template<typename T>
  SEXP foofunc(const T & a)
  {
    return Rcpp::XPtr<tuple_t>(new tuple_t(a,a));
  }
}

// [[Rcpp::export()]]
SEXP foofunc_caller(const int & a) { return foo::foofunc(a); }",
          verbose = TRUE)

VERSION 2:

We define USE_DELETER, and everything works with GCC:

library(Rcpp)
Sys.setenv("PKG_CXXFLAGS" = "-std=c++11 -DUSE_DELETER")
sourceCpp(code="#include <Rcpp.h>
#include <tuple>

#ifdef USE_DELETER
namespace Rcpp {
  template<>
  inline void standard_delete_finalizer<std::tuple<int,int> >( 
std::tuple<int,int> * t ) { delete t; }
}
#endif

namespace foo {
  using tuple_t = std::tuple<int,int>;
  template<typename T>
  SEXP foofunc(const T & a)
  {
    return Rcpp::XPtr<tuple_t>(new tuple_t(a,a));
  }
}

// [[Rcpp::export()]]
SEXP foofunc_caller(const int & a) { return foo::foofunc(a); }",
          verbose = TRUE)

The  output from gcc 4.9 on my system is:

/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_25020.so'  'file53a24f1a73a8.cpp'  
g++ -I/usr/share/R/include -DNDEBUG    
-I"/usr/local/lib/R/site-library/Rcpp/include" -I"/tmp/RtmphmQ6cd"   -std=c++11 
-DUSE_DELETER -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 
-Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c 
file53a24f1a73a8.cpp -o file53a24f1a73a8.o
g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o 
sourceCpp_25020.so file53a24f1a73a8.o -L/usr/lib/R/lib -lR

—Kevin



> On May 20, 2015, at 6:27 PM, Dirk Eddelbuettel <e...@debian.org> wrote:
> 
> 
> Kevin,
> 
> Still not a minimally reproducible example as it lacks
> 
> a) instructions to tell sourceCpp() to turn on C++11 (ie
> 
>   // [[Rcpp::plugins("cpp11")]]
> 
> b) build instructions
> 
> c) run instructions
> 
> We are a fairly common standard for this over here, or on SO.
> 
> Good examples are provided by the Rcpp Gallery which, when sourced by
> Rcpp::sourceCpp(), also runs included R code.
> 
> If you want help from the readers of this list, help them help you by
> reproducible example.  Nobody has time to figure out what you may have
> meant.  Make it explicit.
> 
> Dirk
> 
> -- 
> http://dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org

_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to