[Rcpp-devel] Linking code in src/ subfolders
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