[Rcpp-devel] Sharing Cpp code between packages
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