From ripley at stats.ox.ac.uk  Mon Feb  5 16:09:34 2007
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Mon, 5 Feb 2007 15:09:34 +0000 (GMT)
Subject: [Rd] How to customize the list of exported functions in a
 shared library
In-Reply-To: <20070205140354.GA12059@tehun.pair.com>
References: <8803194.post@talk.nabble.com>
	<20070205140354.GA12059@tehun.pair.com>
Message-ID: <Pine.LNX.4.64.0702051505440.26938@gannet.stats.ox.ac.uk>

It is a bit different on Windows, since it is making a DLL and GNU ld has 
lots of special-casing for those.

To see how to do it, look at the standard package 'stats'.  That has a 
.def file and it works.  The naming convention is probably what you 
missed.  (Also, things have changed since R 2.2.1.)

On Mon, 5 Feb 2007, Andrew Piskorski wrote:

> On Mon, Feb 05, 2007 at 01:28:24AM -0800, Vladimir Eremeev wrote:
>> I am writing binding from C library to R.
>> I use R 2.4.1, windows XP, and MinGW.
>
>> R CMD SHLIB -d --output=Rsnns.dll  [ list of all C sources]
>
>> R CMD SHLIB -d --output Rsnns.dll Rsnns.c -Wl,-Lc:/mingw/lib,-lfl,-L../sources,-lkernel,-lfunc
>
> You should probably also show us the actual compiler/linker commands
> that "R CMD SHLIB" is generating, so we can be sure of what's really
> going on.
>
> I'm not sure what you may have to do differently with MinGW on Windows
> (what linker does that use anyway?), but for comparison, here's how I
> do it for R 2.2.1, on Linux (Ubuntu Dapper 6.06), with gcc 4.0.3, and
> Gnu ld 2.16.91:
>
> For my own custom R package's C code, my Makefile says:
>
>  OBJ = ../foo.o $(patsubst %.c,%.o,$(wildcard ../source/[a-z]*.c))
>  $(OBJ): %.o:  %.c $(HDRS)
>  R.so: $(OBJ) Makevars vis.map
>          R CMD SHLIB -o my_pkg_name_R.so $(OBJ)
>
> My Makevars includes this:
>
>  PKG_LIBS = -Wl,--version-script=vis.map
>
> And when I build my R package, the R.so make target above generates
> this link command:
>
>  gcc -shared -o my_pkg_name_R.so [lots of *.o filenames here] -Wl,--version-script=vis.map -L/usr/lib/R/lib -lR
>
> My vis.map file, which uses Gnu ld syntax, looks like this:
>
>  {
>     global: my_pkg_*;
>     local:*;
>  };
>
> That works, my shared library exports ONLY the symbols starting with
> "my_pkg_", everything else remains private.
>
> It's the "--version-script" linker option doing the magic.  Even with
> Gnu ld, there are definitely other ways to control symbol visibility,
> but that one seemed most convenient in my case.
>
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] How to customize the list of exported functions in a shared library
Prof Brian Ripley