[Rcpp-devel] Sharing Cpp code between packages

Alessandro Mammana mammana at molgen.mpg.de
Tue May 20 17:59:14 CEST 2014


My bad, I forgot to call the compileAttributes function... T.T
Everything works fine!!! Yes, I don't need object code.
 "tweak the Makevars", I meant in package P, because now the files are
not in src/ anymore, but I moved them to /inst/include.
In package Q no need to tweak the Makevars :D

On Tue, May 20, 2014 at 5:41 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
>
> On 20 May 2014 at 17:26, Alessandro Mammana wrote:
> | Dear All,
> | first of all thanks again for Rcpp, I am becoming more and more
> | dependent on it and I am filling my directories with .cpp scripts...
> |
> | I have a Rcpp package P using some header file F.hpp in its src/
> | directory. This file F.hpp contains templated functions and structs.
> | Is there a way for a new Rcpp package Q to include file F.hpp?
>
> Yes.
>
> But you need to move it from src/F.hpp to inst/include/F.hpp which, once
> installed, will become include/F.hpp.
>
> The big trick then is that by just saying "LinkingTo: P" you get R to do the
> right thing via the appropriate -I.... flags.
>
> This is essence all that the package BH does to give everybody Boost headers.
>
> | I read already Writing R Extensions "Linking to native routines in
> | other packages" as well as Rcpp-attriibutes, "Providing a C++
> | Interface". It looks like there are two mechanisms for sharing c++
> | code.
> | 1. The "interface" mechanism: the real code is in the src/ directory
> | but it is referred to from some headers in the inst/include directory.
> | Additionally, these headers need to be wrapped with some (boilerplate
> | and obscure to me) C code. This works only with functions. The
> | boilerplate code can be nicely generated automatically with Rcpp
> | attributes.
>
> Yes. That is probably the best route __when you need object code__.  I am
> using that in package RcppXts from (non-Rcpp) package xts, and in the new
> RcppRedis from RApiSerialize.
>
> The exporting package also needs to do some work.  See for example
> RApiSerialize -- all it does is register two functions.  The mechanism is
> pure R mechanics and not Rcpp specific but can be used by Rcpp if you want
> to.
>
> | 2. The "direct" mechanism: just put the code in inst/include and tweak
> | the Makevars so that the compiler knows where to look for those
> | headers. This should work also with structs and templated cpp code.
>
> See above. No tweaks to Makevars needed (!!) but works only for template headers.
>
> | I think I need the "direct" mechanism.
> | In package P, I moved my hpp files in inst/include and tweaked the
> | Makevars, the package compiled fine.
> | Now in package Q I am trying to use some of the stuff, and I am
> | including the files I need. I also did the following:
> | 1. put import(P) in Q's namespace file
> | 2. put Import P and LinkingTo P in Q's description file
> |
> | however during compilation I got an error like:
> | undefined symbol: _Z16rcpp_hello_worldv
>
> It is a linking error.
>
> | do you know what could be wrong?
>
> Are you expecting object code? Then you need to do more.
>
> You are doing the right thing by working it out with small examples.
>
> Dirk
>
> | Thanks a lot and sorry for bothering.
> |
> | Ale
> |
> |
> | --
> | Alessandro Mammana, PhD Student
> | Max Planck Institute for Molecular Genetics
> | Ihnestraße 63-73
> | D-14195 Berlin, Germany
> | _______________________________________________
> | Rcpp-devel mailing list
> | Rcpp-devel at lists.r-forge.r-project.org
> | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
> --
> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com



-- 
Alessandro Mammana, PhD Student
Max Planck Institute for Molecular Genetics
Ihnestraße 63-73
D-14195 Berlin, Germany


More information about the Rcpp-devel mailing list