[Rcpp-devel] correct way of making custom as and wrap functions available to other packages

Dirk Eddelbuettel edd at debian.org
Fri Jul 17 17:09:39 CEST 2015

On 17 July 2015 at 16:32, Simon Barthelmé wrote:
| Dear list,
| For a package I'm developing (https://github.com/dahtah/imager/) I had 
| to write custom "as" and "wrap" functions for third-party classes. I'd 
| like to make these wrappers accessible to other developers via inline 
| C++ as well as LinkingTo directives (so that they can be used in other 
| packages).
| So far I've only managed the former: I have a header file in 
| inst/include, called "wrappers.h", that contains the full 
| implementations of my custom as and wrap functions. I've written a 
| custom inline plugin and everything works fine. However, LinkingTo 
| doesn't work: wrappers.h gets included in multiple object files and I 
| get linking errors (the linker complains about multiple declarations of 
| "as" and "wrap").
| I understand RcppArmadillo manages to get around the problem but I can't 
| figure out how. What's the correct way of doing this? Is there a way of 
| making as and wrap inline functions so that it's safe to have 
| header-only implementations?

Am at work now with my wrapped in another issue but I think one way of fixing
this is to ensure that only one compilation unit includes the file. Another
is to make sure the header file is "pure" in the 'just templates' sense so
that you do not get multiple instantiations.  A third is to use #define
statements to separate declarations (used for other packages) from definitions
and instantiations (which your package uses).

I definitely had this design issue and managed to address it.  With a bit
more coffee I may even remember which package that was in...


http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org

More information about the Rcpp-devel mailing list