[R] how to link C code with gsl from R CMD and dyn.load

Dirk Eddelbuettel edd at debian.org
Fri Nov 20 03:23:48 CET 2009


On 19 November 2009 at 20:29, Hao Cen wrote:
| Hi,
| 
| I am writing a function in C that is meant to be called by R. In the C
| function, I used a gsl function gsl_stats_mean. The code is as simple as
| below
| 
| void gsl(double *m, int *dim){
| 	int r, c;
| 	r = dim[0];
| 	c = dim[1];
| 
| 	double mean = gsl_stats_mean(&m[0], 1, r);
| 	Rprintf("mean = %f\n", mean);
| }
| 
| 
| The C code is succesfully compiled and the output is as follows.
| $ R CMD SHLIB hello.c
| WARNING: ignoring environment value of R_HOME
| gcc -std=gnu99 -I/usr/local/R-2.8.1/lib64/R/include  -I/usr/local/include 
|   -fpic  -g -O2 -c hello.c -o hello.o
| gcc -std=gnu99 -shared -L/usr/local/lib64 -o hello.so hello.o
| 
| However, as I tried to load it in R
| 
| libPath = "~/ccode"
| dyn.load(file.path(libPath, "hello.so"))
| 
| I got an error message in R
| 
| Error in dyn.load(file.path(libPath, "hello.so")) :
|   unable to load shared library '~/ccode/hello.so':
|   ~/ccode/hello.so: undefined symbol: gsl_stats_mean
| 
| I do have gsl installed and the gls lib folder has both libgsl.a and
| libgsl.so.
| 
| How I can link the C code with gsl library from R CMD SHLIB?
| 
| Any suggestions would be appreciated.

Set the PKG_LIBS variable as you would in src/Makevars for a package, i.e.


    $ PKG_LIBS="-lgsl -lblas" R CMD SHLIB hello.c

maybe all it takes.  You may need to add PKG_CPPFLAGS as well if you need
-I... for include directories.

See the 'R Extensions' manual for more, and / or some of the CRAN packages
that wrap GSL code.

Dirk

-- 
Three out of two people have difficulties with fractions.




More information about the R-help mailing list