[R] C++ code from R

Duncan Temple Lang duncan at wald.ucdavis.edu
Wed Nov 19 13:57:03 CET 2008



Rainer M Krug wrote:
> Hi
> 
> I managed to compile (and use) C code from R, but now I have to use C++ code.
> After reading "Writing R extensions", I came up with the following
> code, which compiles fine
> 
> -------------------
> // emdL1_R.cc:
> 
> #include <time.h>
> #include <stdio.h>
> #include "emdL1.h"
> 
> extern "C"
> {
>   void emd_L1(
> 	      double *H1, int *n1,
> 	      double *H2, int *n2,
> 	      int *Dims,
> 	      double *e
> 	      )
>   {
>     EmdL1 em;			// EMD_L1 class
> 
>     e[0] = em.EmdDist( H1,H2, n1[0],n2[0], Dims[0]);			// 2D EMD_L1
> 
>     printf("For 2D histograms,  EmdL1(h1,h2)=%lf\n", e[0]);
>   }
> }// extern "C"
> -------------------
> -------------------
> Compilation started at Wed Nov 19 14:30:42
> 
> R CMD SHLIB emdL1.cpp emdL1_R.cc
> g++ -I/usr/share/R/include      -fpic  -g -O2 -c emdL1.cpp -o emdL1.o
> g++ -I/usr/share/R/include      -fpic  -g -O2 -c emdL1_R.cc -o emdL1_R.o
> g++ -shared  -o emdL1.so emdL1.o emdL1_R.o   -L/usr/lib/R/lib -lR
> 
> Compilation finished at Wed Nov 19 14:30:44
> 
> Compilation started at Wed Nov 19 14:37:12
> 
> R CMD SHLIB emdL1_R.cc
> g++ -shared  -o emdL1_R.so emdL1_R.o   -L/usr/lib/R/lib -lR



You should compile all the files into one single .so
So use the first call to R CMD SHLIB, i.e. (with the order
of the files switched)

   R CMD SHLIB emdL1_R.cc emdL1_R.cc

and then in R

   dyn.load("emdL1_R.so")

should work.

The problem was that in the second SHLIB call,
you compiled and linked emdL1_R.cc into emdL1_R.so but didn't
include the emdL1.cc file which contains the classes and routines you
refer to in emdL1_R.cc

  D.




> 
> Compilation finished at Wed Nov 19 14:37:12
> -------------------
> 
>  but when I want to load the resulting .so file (emdL1_R.so), I get
> the following error message:
> 
> -------------------
>> dyn.load("emdL1_R.so")
> Error in dyn.load("emdL1_R.so") :
>   unable to load shared library
> '/home/rkrug/Documents/Projects/EMD/EmdL1_vs/emdL1_R.so':
>   /home/rkrug/Documents/Projects/EMD/EmdL1_vs/emdL1_R.so: undefined
> symbol: _ZN5EmdL1D1Ev
> -------------------
> 
> 
> The two other files (emdL1.h and emdL1.cpp) are in the following zip file:
> 
> http://vision.ucla.edu/~hbling/code/EmdL1_v2.zip
> 
> 
> Any suggestions are welcome,
> 
> Rainer
> 
> 
> 
>



More information about the R-help mailing list