[Rcpp-devel] Rcpp build trouble with strings

jacob.a.russell.th at dartmouth.edu jacob.a.russell.th at dartmouth.edu
Mon Aug 19 19:10:59 CEST 2013


Hey again,

I built the default Rcpp.package.skeleton rcpp_hello_world to take in
strings and it worked fine. My problems seem to be from the libraries
themselves. I recompiled the libraries that I could to be shared
libraries and now the package builds the .so file, but I still get an
error when checking the package.

Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object
  '/home/jrussell/src/C++/NLP/RDGGDriver/SantosDartmouth.Rcheck/SantosDartmouth/libs/SantosDartmouth.so':
    liblink_4_1b.so: cannot open shared object file: No such file or directory

The library liblink_4_1b.so is link grammar with slight modifications to
work with C++ code instead of C code and doesn't have an R package. I
have placed all libs in the src directory of the package, and they can
all be found at build time, and the .so file seems to be correctly
built, but then when it is checked, it seems not to use the same
ldflags that it uses when building (PKG_LIBS). Is this something that I
need to set separately? I have tried ??Makevars and google searches for
"R Makevars" and "external libraries Rcpp" and not found much. Are there
any concrete examples of packaging external libraries inside of R
packages? I have gone through all of the vignettes that I could find and
can't seem to find anything about including pre-built .so files in
packages. I suspect this is to keep source-only, but the libraries are
not all mine and I don't have this option available.

Thanks!

Jacob Russell

P.S. Time-To-Response on this mailing list is probably the best that I
have ever seen on a mailing list. Congrats!

On Fri, Aug 16, 2013 at 12:52:37PM -0500, Dirk Eddelbuettel wrote:
> 
> On 16 August 2013 at 13:45, jacob.a.russell.th at dartmouth.edu wrote:
> | Hello,
> | 
> | I am trying to build a package but I have quite a few dependencies. As such, I
> | have modified Makevars to be (I don't like backticks because I find them too
> | similar to single quotes):
> | 
> | PKG_LIBS = $($(R_HOME)/bin/Rscript -e 'Rcpp:::LdFlags()') -L. -llink_4_1b -lDGG -lSTR -lDLL -lAF -lmy_std -lm
> | PKG_CPPFLAGS=-I. -g
> | 
> | Which seems to compile when my R wrapper is (incorrectly):
> | 
> | RcppExport SEXP getDocGraph(std::string input){
> |     
> |     std::string testStr = input;
> |     std::string output=getDG(testStr);
> |     return(Rcpp::wrap(output));
> | }
> | 
> | but then it gives me a segmentation fault because it cannot access the
> | underlying character array (or general object) passed in by R.
> | 
> | Then if I change the function protoype to:
> | 
> | RcppExport SEXP getDocGraph(SEXP input){
> |     
> |     std::string testStr = Rcpp::as<std::string>(input);
> |     std::string output=getDG(testStr);
> |     return(Rcpp::wrap(output));
> | }
> | 
> | it seems to compile, but when I go to check the package, the .Rcheck directory
> | gives me an error:
> | 
> | ** testing if installed package can be loaded
> | Error in dyn.load(file, DLLpath = DLLpath, ...) : 
> |   unable to load shared object ...<packagename>.so':
> | 
> | and the .so file is not in the tgz package, but no error was given during
> | compilation.
> | 
> | Any help is greatly appreciated.
> 
> Simplify. 
> 
> I would start by removing your six additional libraries and convince myself
> that accessing a string via Rcpp works (and as our unit tests do that a lot,
> you would have to be in a very unusual situation to not have it work).
> 
> Once that works, add your libraries. If and when things break again, examine
> the differences.
> 
> Dirk
> 
> -- 
> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list