Skip to content

Instantly share code, notes, and snippets.

@lindenb
Created July 28, 2014 08:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lindenb/7cd766cbb37de01f6cce to your computer and use it in GitHub Desktop.
Save lindenb/7cd766cbb37de01f6cce to your computer and use it in GitHub Desktop.
R dyn.load("libcfile.so")
#include <R.h>
#include <Rinternals.h>
#include <Rdefines.h>
#include <stdio.h>
SEXP RIbdDbClose(SEXP handle)
{
void *p = R_ExternalPtrAddr(handle);
fprintf(stderr,"closing H5 file");
if(p!=NULL)
{
FILE* f=(FILE*)p;
fclose(f);
}
R_ClearExternalPtr(handle);
return ScalarLogical(0);
}
static void _RIbdDbFinalizer(SEXP handle)
{
RIbdDbClose(handle);
}
SEXP RIbdDbOpen(SEXP Rfilename)
{
FILE* in;
const char* filename= CHAR(STRING_ELT(Rfilename, 0));
if(filename==NULL) { fprintf(stderr,"Cannot open %s",filename); exit( -1);}
in=fopen(filename,"r");
if(in==NULL) { fprintf(stderr,"Cannot open %s",filename); exit( -1);}
SEXP ext = PROTECT(R_MakeExternalPtr(in, R_NilValue, R_NilValue));
R_RegisterCFinalizerEx(ext,_RIbdDbFinalizer, TRUE);
UNPROTECT(1);
return ext;
}
dyn.load("libcfile.so")
all: lib/libcfile.so
lib/libcfile.so: cfile.c
mkdir -p lib
R CMD SHLIB -o $@ cfile.c
clean:
rm -f *.o *.so lib/libcfile.so

compile

$ make clean && make
rm -f *.o *.so lib/libcfile.so
mkdir -p lib
R CMD SHLIB  -o lib/libcfile.so cfile.c
make[1]: Entering directory `/home/lindenb/src/tmp'
gcc -std=gnu99 -I/commun/data/packages/R-2.15-3/lib64/R/include -DNDEBUG  -I/usr/local/include    -fpic  -g -O2  -c cfile.c -o cfile.o
gcc -std=gnu99 -shared -L/usr/local/lib64 -o lib/libcfile.so cfile.o
make[1]: Leaving directory `/home/lindenb/src/tmp'

check LD_LIBRARY_PATH

$ echo $LD_LIBRARY_PATH
/home/lindenb/src/tmp/lib

execute R

$ R --vanilla  < cfile.R 

> dyn.load("libcfile.so")
Error in dyn.load("libcfile.so") : 
  unable to load shared object '/home/lindenb/src/tmp/libcfile.so':
  /home/lindenb/src/tmp/libcfile.so: cannot open shared object file: No such file or directory
Execution halted
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment