On 20/04/2011 4:38 PM, Dirk Eddelbuettel wrote:

On 20 April 2011 at 16:24, Duncan Murdoch wrote:
| On 20/04/2011 4:06 PM, Sascha Vieweg wrote:
|>  Hello R experts
|>
|>  I am googling and reading around, however, I can't get it working
|>  (perhaps because I do not understand much C, however, I'll give it
|>  a try). I am trying to include C++ code into an R routine, where
|>  the C++ code looks:
|>
|>  #include<iostream>
|>  using namespace std;
|>  void foo (double* x, double* y, double* out)
|>  {
|>           out[0] = x[0] + y[0];
|>  }
|>
|>  Back in R, the command
|>
|>  R CMD SHLIB --preclean -o xplusy
|>
|>  works fine resulting in two new files, xplusy.o and xplusy.so. The
|>  wrapper in R is:
|>
|>  dyn.load("xplusy.so")
|>  xplusy<- function(x, y){
|>      .C("foo", as.double(x), as.double(y), out=double(1))$out
|>  }
|>  xplusy(1, 2)
|>  dyn.unload("xplusy.so")
|>
|>  Now, dyn.load() works and xplusy also shows up in getLoadedDLLs().
|>  However, when invoking the function, xplusy(1, 2), R complains:
|>
|>  Error in .C("foo", as.double(x), as.double(y), out = double(1)): C
|>  symbol name "foo" not in load table
|>
|>  I found some hints concerning Fortran code producing this error
|>  message, but no help concerning C code.
|
| You have C++ code, not C code.  C++ normally mangles names of exports.
|
| To get this to work, you should surround your declarations with
|
| extern "C" {
| }
|
| Another possibility is to use the Rcpp package; it writes the interface
| code for you.

I believe Duncan refers to the 'inline' package, rathern than 'Rcpp' (which
itself uses 'inline').

Oops, Dirk is right.

Duncan Murdoch

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to