[R] Include C++ DLL, error in ...: C symbol name not in load table
Dirk Eddelbuettel
edd at debian.org
Wed Apr 20 22:38:04 CEST 2011
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').
Dirk
--
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
More information about the R-help
mailing list