[Rcpp-devel] Linking code in src/ subfolders

JJ Allaire jj.allaire at gmail.com
Wed Mar 11 00:06:07 CET 2015


Right now compileAttributes doesn't scan code in subdirectories. This
is mostly because for it to be really seamless compileAttributes
should run before every build. We therefore want to keep the total
execution time <= 50ms.

Since some R packages have *a lot* of code in subdirectories of src we
didn't want to get into scanning recursively before every build.




On Tue, Mar 10, 2015 at 6:23 PM, Balamuta, James Joseph
<balamut2 at illinois.edu> wrote:
> Greetings and Salutations All,
>
> I’m trying to add structure to the src folder since the amount of files I
> have residing in the src directory could be better organized. Note: These
> files are made using RcppArmadillo.
>
>
>
> E.g.
>
>
>
> I’m looking to go from:
>
> src/
>     |-> main.cpp
>
>     |-> testA.cpp
>
>     |-> testA.h
>
>     |-> testB.cpp
>
>     |-> testB.h
>
>
>
> To a structure like:
>
>
> src/
>    |-> main.cpp
>    |-> A
>
>        |-> testA.cpp
>
>        |-> testA.h
>
>    |-> B
>
>        |-> testB.cpp
>
>        |-> testB.h
>
>
>
> Each file has a function:
>
> main.cpp => testfunction(x)
>
> testA.cpp => testfunctionA(x)
>
> testB.cpp => testfunctionB(x)
>
>
>
> To illustrate the issue, I have two repositories
>
>
>
> SrcDir: https://github.com/coatless/header_cpp_subdir_code
>
> SubdirSrc: https://github.com/coatless/header_cpp_code
>
>
>
> If I compile without trying to change the folder structure, the package is
> made and is able to use without issue.
>
>
>
> However, when I attempt to change the folder structure, I was getting a
> compiler error that identifies with a linking issue:
>
>
>
> main.o:main.cpp:(.text+0x650a): undefined reference to
> `testfunctionA(arma::Col<double> const&)'
>
> I looked at CRANs documentation for a suggested fix and ended up trying to
> ensure a link by using the makevars file (see:
> http://cran.r-project.org/doc/manuals/r-release/R-exts.html#Using-Makevars)
>
>
> I made the following changes:
>
>
>
> The Makevars file update seemed to work as the package then compiled.
>
> (Exact changes to Makevars.win:
> https://github.com/coatless/header_cpp_subdir_code/blob/master/src/Makevars.win
> )
>
>
>
> Herein lies the issues:
>
>
>
> 1.        Any files I’ve written in the subdirectories are no longer
> exported to RcppExport.cpp even though they have a // [[Rcpp::export]] tag
> preceding the function declaration.
>
> 2.       When I try to call the function in main.cpp (testfunction(x)), I
> receive:
>
> testfunction(2^(1:5))
>
> Error in .Call("SubdirSrc_testfunction", PACKAGE = "SubdirSrc", x) :
>
>   "SubdirSrc_testfunction" not available for .Call() for package "SubdirSrc"
>
>
>
>
>
> Any suggestions would be appreciated.
>
> Sincerely,
>
>
> JJB
>
>
> _______________________________________________
> 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


More information about the Rcpp-devel mailing list