[R] Calling Fortran from R: Issues with dynamic loading of fortran dll
Duncan Murdoch
murdoch.duncan at gmail.com
Mon Jan 16 15:37:44 CET 2012
On 16/01/2012 8:55 AM, David Stevens wrote:
> I installed RTools - though I'm unable to use it within R, from the
> command prompt the file will compile and create the foo.dll using R CMD
> SHLIB foo.f. I simlified to code for fortran IV (?really) compliance
>
> foo.f:
>
> Subroutine foo(x)
> real x
> x = x + 2.
> return
> end
>
> R CMD SHLIB foo.f
> cygwin warning:
> MS-DOS style path detected: d:/PROGRA~1/r/R-214~1.1/etc/i386/Makeconf
> Preferred POSIX equivalent is:
> /cygdrive/d/PROGRA~1/r/R-214~1.1/etc/i386/Makeconf
> CYGWIN environment variable option "nodosfilewarning" turns off this
> warning.
> Consult the user's guide for more details about POSIX paths:
> http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
> gfortran -O3 -mtune=core2 -c foo.f -o foo.o
> gcc -shared -s -static-libgcc -o foo.dll tmp.def foo.o
> -Ld:/RCompile/CRANpkg/extralibs/local/lib/i386
> -Ld:/RCompile/CRANpkg/extralibs/local/lib -lgfortran
> -Ld:/PROGRA~1/r/R-214~1.1/bin/i386 -lR
>
> Now the issue is getting it to dyn.load("foo.dll"). I'm greeted with
>
> Error in inDL(x, as.logical(local), as.logical(now), ...) :
> unable to load shared object 'd:/Fortran folders/Fortran
> Multiresponse/foo.dll':
> LoadLibrary failure: %1 is not a valid Win32 application.
>
> Any thoughts?
It worked for me. That is, I created the foo.f file, then ran
R CMD SHLIB foo.f
from the command line, then rgui on the command line. Once in R I ran
dyn.load("foo.dll")
and it worked without a complaint on my system. I would guess the
differences are:
1. I have the stupid "nodosfilewarning" set to keep Cygwin programs quiet:
set CYGWIN=nodosfilewarning
2. I ran rgui from the command line. That means I got it from the same
path where R was found in the R CMD SHLIB call. You might have run a
different version, or might have been in a different directory, trying
to load some other "foo.dll" if you started rgui in some other way.
Duncan Murdoch
> David S
>
> On 1/15/2012 5:09 PM, Duncan Murdoch wrote:
> > On 12-01-15 5:34 PM, David Stevens wrote:
> >> I successfully used .Fortran to load and execute my fortran procedures
> >> under WinXP and 32 bit R. Alas, the same isn't true with my next Windows
> >> 7/64 machine, R 2.14.1 (64 bit) and the gnu gfortran (64) compiler
> >> (mingw64 v. 4.6.1). Though I'm able to compile the routines from the
> >> command line using gfortran '...', .Fortran('foo2') results in an error
> >> saying the Fortran symbol name "foo2" not in load table.
> >>
> >> foo.f90:
> >>
> >> Module foo
> >> contains
> >> Subroutine foo2(x)
> >>
> >> real(kind=8),intent(inout) :: x
> >> x = x + 2
> >>
> >> end subroutine foo2
> >>
> >> end module foo
> >>
> >> c:\mingw64\bin\gfortran --shared -Wall -pedantic -g -o foo.dll foo.f90
> >>
> >> ff = "d:/Fortran folders/Fortran Multiresponse/foo.dll"
> >> x= dyn.load(ff)
> >> .Fortran('foo2',as.double(1))
> >>
> >> Error in .Fortran("foo", as.double(1)) :
> >> Fortran symbol name "foo" not in load table
> >>
> >> Can someone point me in the direction of a solution?
> >
> > Some or all of these might help:
> >
> > 1. Get R to do the compiling for you: it knows the compiler
> > arguments that produce compatible code. (Use R CMD shlib for this.)
> >
> > 2. Use a compiler supplied with the Rtools collection.
> >
> > 3. Find out what name got exported, and use .C instead of .Fortran to
> > call that.
> >
> > Duncan Murdoch
>
More information about the R-help
mailing list