The problem is your path. You are finding a 64 bit compiler first, so you get a 64 bit dll.

The path I use has these components in this order (as recommended in our docs, and as set by the Rtools installer):

Rtools/bin
Rtools/perl/bin
Rtools/MinGW/bin      # NOT MinGW64/bin as you had
<other stuff, including R 2.14.1/bin/i386>

So the error message was likely correct: your compiler wasn't producing a Win32 DLL, it was producing a Win64 DLL.

Duncan Murdoch


On 16/01/2012 11:34 AM, David Stevens wrote:
I'm a little worried this is getting off track.  I'll recap

1. I'm using R 2.14.1 from CRAN - installed last week in d:\program
files\R\R-2.14.1 using the Windows installer
2. I've just installed Rtools 15.1 this morning in d:\Rtools at Duncan's
recommendation using the Rtools Windows installer
3. my folder is "d:\fortran folders\fortran multiresponse"
4. my file is "foo.f"
5. from the command line I navigate to my folder where foo.f is located
6. from the command line I type "set CYGWIN=nodosfilewarning"
7. from the command line I then type "R CMD SHLIB foo.f" and get
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
8. I check the directory and find a newly created foo.dll
9. from the command line I type 'rgui' (w/o the quotes) and an R console
opens with V 14.1 on the masthead
10. In R, I check the path with getwd() and find my path "d:\fortran
folders\fortran multiresponse"
11. then from the R gui dyn.load("foo.dll")yields

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*.

12. To make sure that the proper file is being found, from the command
line I delete foo.dll and try again

  >  dyn.load("foo.dll")

Error in inDL(x, as.logical(local), as.logical(now), ...) :
    unable to load shared object 'd:/Fortran folders/Fortran
Multiresponse/foo.dll':
    LoadLibrary failure: *The specified module could not be found*.

13. I then recreate foo.dll as above and try to load

Errorin 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*.
nd.

14. So, I try to build the dll from R

system("R CMD SHLIB foo.f")

x86_64-w64-mingw32-gcc -shared -s -static-libgcc -o foo.dll tmp.def
foo.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64
-Ld:/RCompile/CRANpkg/extralibs64/local/lib -lgfortran
-LD:/PROGRA~1/R/R-214~1.1/bin/x64 -lR
d:/rtools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.5.2/../../../../x86_64-w64-mingw32/bin/ld.exe:
i386 architecture of input file `foo.o' is incompatible with i386:x86-64
output
foo.o:foo.f:(.text+0x44): undefined reference to `__gfortran_st_write'
foo.o:foo.f:(.text+0x58): undefined reference to `__gfortran_transfer_real'
foo.o:foo.f:(.text+0x60): undefined reference to `__gfortran_st_write_done'
collect2: ld returned 1 exit status

15. No good, so I check the path
PATH=...;d:\program
files\r\r-2.14.1\bin;D:\Rtools\bin;D:\Rtools\perl\bin;D:\Rtools\MinGW64\bin;D:\Program
files\R\R-2.14.1\bin\x64;

16. Going back to compiling from the command line, it appears to me that
the Rtools compiler (I assume that's what's used with the R CMD SHLIB
command) is delivering an incompatible dll.

Shall I delete everything, reinstall, and try again?

BTW, I've successfully used .Fortran on previous versions of  R and
plain vanilla gfortran (from gcc) on an older winxp32 machine using
fairly sophisticated fortran 95 code, with modules, structures, etc, so
I'm not a complete babe-in-the-woods (though apparently I'm back to
being that). That said there is much I don't know especially about
differences between 32- and 64-bit code that comes from the compilers
and interfaces between R and shared libraries

Any and all help is appreciated!

David

On 1/16/2012 7:37 AM, Duncan Murdoch wrote:
>  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
>>
>


______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to