<div dir="ltr">Hi, John,<div><br></div><div>Making your code header-only is your best choice and it will make everything easier.</div><div><br></div><div>If header-only is impossible, this can happen, there is one trick you may want to try.</div><div><br></div><div>As I remember the early version of Rcpp, maybe before 0.9, it builds a libRcpp.so when installing Rcpp.</div><div><br></div><div>You can also do this by adding several lines in Makevars [1] and write helper functions to help system find the shared library you want to link to [2].</div><div><br></div><div>But I don't think this is good practice for Rcpp developing.</div><div><br></div><div>Best wishes,</div><div><br></div><div>KK</div><div><br></div><div>[1] <a href="https://github.com/thirdwing/RcppMLPACK/blob/master/src/Makevars#L44-L61" target="_blank">https://github.com/thirdwing/RcppMLPACK/blob/master/src/Makevars#L44-L61</a></div><div><br></div><div>[2] <a href="https://github.com/thirdwing/RcppMLPACK/blob/master/R/flags.R" target="_blank">https://github.com/thirdwing/RcppMLPACK/blob/master/R/flags.R</a></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 6, 2015 at 5:03 PM, John Tipton <span dir="ltr"><<a href="mailto:jtipton25@gmail.com" target="_blank">jtipton25@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hey Rcpp developers,</div><div><br></div><div>I am brand spanking new to the Rcpp community and I want to introduce myself with what is likely a very simple question that I haven't found an answer for yet. My question is on package development and linking c++ files from one package directly to another package without having to create a CCallable function . As a relatively experienced R programmer but novice c++ programmer, I am still learning as I go so I created a minimal example below that I believe better illustrates my question.</div><div><br></div><div>I am building a package with RStudio and I want to make available to another package the .h header files - (more explicitly the c++ subroutines in those headers) without the loss of computation speed shown below. </div><div><br></div><div>My question can best be summarized with two parts</div><div><br></div><div>1) Why when I directly source testPack.h is the function call so much slower than when I define the function in the same .cpp file (i.e. why is fun1.cpp so much slower (~40%) than fun2.cpp in test.R)</div><div><br></div><div>2) How do I build a library in an automated fashion (maybe there is a CPPFLAGS variable?) so I can use the functionality of something like #include “path/to/file/hello_world2.h” in fun2.cpp without using an absolute path? I am building a large MCMC sampler so every bit of marginal speed gain is important. In other words, how can I replicate the behavior of fun2.cpp in a function that sources my library testPack</div><div><br></div><div><br></div><div>I have the following files (outside my package) that provide testing. Thanks for any help.</div><div><br></div><div>test.R</div><div>fun1.cpp <- includes <testPack.h> header, runs slow</div><div>fun2.cpp <- includes “hello_world2.h” header, runs faster</div><div><br></div><div>I built a package skeleton in RStudio using Rcpp. Within the src directory I have the files</div><div><span style="white-space:pre-wrap"> </span>hello_world2.h</div><div><span style="white-space:pre-wrap">   </span>cpp_hello_world.cpp</div><div><br></div><div><br></div><div>The files are as follows</div><div>##</div><div>##</div><div>##</div><div>———— begin test.R script ————</div><div><br></div><div>library(rbenchmark)</div><div>n <- 10000</div><div>Rcpp::sourceCpp('~/test/fun1.cpp’)</div><div>Rcpp::sourceCpp('~/test/fun2.cpp’)</div><div><br></div><div>benchmark(fun1(n), fun2(n), replications = 500)</div><div><br></div><div>———— end test.R script ————</div><div>##</div><div>##</div><div>##</div><div>———— begin fun1.cpp ————</div><div><br></div><div>#include <RcppArmadillo.h></div><div>#include <testPack.h></div><div>// [[Rcpp::depends(testPack)]]</div><div>// [[Rcpp::depends(RcppArmadillo)]]</div><div><br></div><div>//using namespace Rcpp;</div><div><br></div><div>//[[Rcpp::export]]</div><div>void fun1(const int& n) {</div><div>   for(int i = 0; i < n; i++){</div><div>    testPack::rcpp_hello_world(); </div><div>   }</div><div>}</div><div><br></div><div>———— end fun1.cpp ————</div><div>##</div><div>##</div><div>##</div><div>———— begin fun2.cpp ————</div><div><br></div><div>#include <RcppArmadillo.h></div><div>#include <path/to/file/testPack/src/hello_world2.h></div><div><br></div><div>// [[Rcpp::depends(RcppArmadillo)]]</div><div><br></div><div>//[[Rcpp::export]]</div><div>void fun2(const int& n) {</div><div>   for(int i = 0; i < n; i++){</div><div>    rcpp_hello_world2(); </div><div>   }</div><div>}</div><div><br></div><div>———— end fun2.cpp ————</div><div>##</div><div>##</div><div>##</div><div>———— begin hello_world2.h ————</div><div><br></div><div>Rcpp::List rcpp_hello_world2() {</div><div><br></div><div>    Rcpp::CharacterVector x = Rcpp::CharacterVector::create("foo", "bar");</div><div>    Rcpp::NumericVector y   = Rcpp::NumericVector::create(0.0, 1.0);</div><div>    Rcpp::List z            = Rcpp::List::create(x, y);</div><div><br></div><div>    return z ;</div><div>}</div><div><br></div><div>———— end hello_world2.h ————</div><div>##</div><div>##</div><div>##</div><div>———— begin rcpp_hello_world.cpp ————</div><div><br></div><div>#include <RcppArmadillo.h></div><div><br></div><div>// [[Rcpp::depends(RcppArmadillo)]]</div><div>// [[Rcpp::interfaces(cpp)]]</div><div><br></div><div>using namespace Rcpp;</div><div><br></div><div>//[[Rcpp::export]]</div><div>List rcpp_hello_world() {</div><div><br></div><div>    CharacterVector x = CharacterVector::create( "foo", "bar" )  ;</div><div>    NumericVector y   = NumericVector::create( 0.0, 1.0 ) ;</div><div>    List z            = List::create( x, y ) ;</div><div><br></div><div>    return z ;</div><div>}</div><div><br></div><div>———— end rcpp_hello_world.cpp ————</div></div>
<br>_______________________________________________<br>
Rcpp-devel mailing list<br>
<a href="mailto:Rcpp-devel@lists.r-forge.r-project.org">Rcpp-devel@lists.r-forge.r-project.org</a><br>
<a href="https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel" target="_blank">https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Qiang Kou<div><a href="mailto:qkou@umail.iu.edu" target="_blank">qkou@umail.iu.edu</a><br><div>School of Informatics and Computing, Indiana University</div><div><br></div></div></div></div>
</div>