Re: [julia-users] Re: Examples of integrating Fortran code in Julia
Welcome to Julia! You probably shouldn't necromance such an old thread, instead make a new one and link to the old ones you researched. Anyway, in the old thread, I linked to a blog post of mine on this topic (I just saw that its formatting was all messed up: now fixed): http://maurow.bitbucket.org/notes/calling_fortran_from_python.html http://maurow.bitbucket.org/notes/calling_fortran_from_c.html The post outlines the steps I did to make it work and how you can use the iso_c_binding module which prevents name-mangling and provides C-datatypes. Maybe this helps. On Mon, 2016-01-18 at 20:36, pokerhontas...@googlemail.com wrote: > Hi, > > first of all, I am new to Julia (and Fortran). I tried to follow OP's > example and call Fortran from Julia. First, I was using the Intel Fortran > compiler and tried to compile the following .f90 file (saved as f90tojl.f90) > > module m > contains >integer function five() > five = 5 >end function five > end module m > > as a shared library, by entering the following in the command line: > > ifort f90tojl.f90 -O2 -dll -fPIC -o ifortlib.dll > > the compiler ignores -fPIC since that's an unknown option apparently but > two files are created, one object file and the dll. I then try to call the > function from Julia and that's where the trouble starts. > > The suggested command in this thread doesn't work because I guess the Intel > compiler has different name mangling than the gfortran compiler. So I tried > to find the name of my function, wikipedia suggests m_MP_five_ for ifort, > so I tried > > julia: ccall( (:m_MP_five, "ifortlib.dll"), Int, () ) > > LoadError: ccall: could not find function m_MP_five in library ifortlib.dll > > > So my guess is that I am not using the correct name mangling. I couldn't find > anything online so I tried to view the function name via the object manager > in visual studio and an external dll viewer program. > In visual studio I got a meaningless error the external viewer just didn't do > anything (although it worked for other dll files). When I type > > julia: Libdl.dlopen("ifortlib.dll") > Ptr{Void} @0x2a9d8fa0 > > fwiw. At this point I got so pissed that I decided to install the gfortran > compiler and just follow this thread step by step. So in the cmd window, I > type: > > gfortran -shared -O2 f90tojl.f90 -fPIC -o gfortlib.dll > > (I get a warning that -fPIC is ignored, as written previously in this > thread). I use the dll viewer to determine the name of the function, its > __m_MOD_five indeed. Then > > julia: ccall( (:__m_MOD_five, "gfortlib.dll"), Int, () ) > > LoadError: error compiling anonymous: could not load library "gfortlib.dll" > The specified module could not be found. > > > And > > julia: Libdl.dlopen("gfortlib.dll") > LoadError: could not load library "gfortlib.dll" > The specified module could not be found. > > > And I have no clue what to do now.
Re: [julia-users] Re: Examples of integrating Fortran code in Julia
Yes, sorry, next time I will open a new thread. I actually already have a new problem, so I am going to post that in a new thread. This particular problem here has been solved. I didn't manage to get it working with ifort (I guess there is no hope?) and with gfortran I noticed that the standard installation of this mingw was somehow 32bit. So I had to reinstall it using the 64bit version and then calling Fortran from Julia worked.
[julia-users] Re: Examples of integrating Fortran code in Julia
I think you need to specify the path that points to the module, not just the module name.
[julia-users] Re: Examples of integrating Fortran code in Julia
Hi, first of all, I am new to Julia (and Fortran). I tried to follow OP's example and call Fortran from Julia. First, I was using the Intel Fortran compiler and tried to compile the following .f90 file (saved as f90tojl.f90) module m contains integer function five() five = 5 end function five end module m as a shared library, by entering the following in the command line: ifort f90tojl.f90 -O2 -dll -fPIC -o ifortlib.dll the compiler ignores -fPIC since that's an unknown option apparently but two files are created, one object file and the dll. I then try to call the function from Julia and that's where the trouble starts. The suggested command in this thread doesn't work because I guess the Intel compiler has different name mangling than the gfortran compiler. So I tried to find the name of my function, wikipedia suggests m_MP_five_ for ifort, so I tried julia: ccall( (:m_MP_five, "ifortlib.dll"), Int, () ) LoadError: ccall: could not find function m_MP_five in library ifortlib.dll So my guess is that I am not using the correct name mangling. I couldn't find anything online so I tried to view the function name via the object manager in visual studio and an external dll viewer program. In visual studio I got a meaningless error the external viewer just didn't do anything (although it worked for other dll files). When I type julia: Libdl.dlopen("ifortlib.dll") Ptr{Void} @0x2a9d8fa0 fwiw. At this point I got so pissed that I decided to install the gfortran compiler and just follow this thread step by step. So in the cmd window, I type: gfortran -shared -O2 f90tojl.f90 -fPIC -o gfortlib.dll (I get a warning that -fPIC is ignored, as written previously in this thread). I use the dll viewer to determine the name of the function, its __m_MOD_five indeed. Then julia: ccall( (:__m_MOD_five, "gfortlib.dll"), Int, () ) LoadError: error compiling anonymous: could not load library "gfortlib.dll" The specified module could not be found. And julia: Libdl.dlopen("gfortlib.dll") LoadError: could not load library "gfortlib.dll" The specified module could not be found. And I have no clue what to do now.
[julia-users] Re: Examples of integrating Fortran code in Julia
Also you're going to be better off using the MinGW-w64 cross-compilers, rather than the Cygwin's own gfortran. Try installing mingw64-x86_64-gcc-fortran through Cygwin's setup for 64 bit, or mingw64-i686-gcc-fortran for 32 bit. Then instead of calling gfortran to compile your Fortran code, call x86_64-w64-mingw32-gfortran (or i686-w64-mingw32-gfortran for 32 bit). Everything else should work more or less the same. On Tuesday, December 16, 2014 6:04:43 PM UTC-8, Vathy M. Kamulete wrote: I posted this on StackOverflow. It was recommended I post here. See here http://stackoverflow.com/q/27498755/1965432for background. Where can I find good examples of integrating (modern) Fortran code with Julia? I am using the GNU gfortran compiler (on Cygwin) for my own module. A good example will hopefully start from the compilation stage, address mangled names and call the subroutine from Julia via ccall. Most examples I've seen skip the first two stages. On the SO post, I refer to Modern Fortran explicitly because what I've seen so far tends to be for legacy code -- think punchcard-style fixed-width formatting Fortran (that goes for GLMNet, which was allegedly written in 2008 but adheres to those conventions). So imagine that I have the following module in Fortran90 file named 'f90tojl.f90': module m contains integer function five() five = 5 end function five end module m This example is from here http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_Fortran. I compile it with gfortan as follows to create a shared library: gfortran -shared -O2 f90tojl.f90 -o -fPIC f90tojl.so And my, admittedly shaky, understanding from reading the julia docs suggest that I should be able to call the function five like so: ccall( (:__m_MOD_five, f90tojl), Int, () ) It didn't work for me. I get ''error compiling anonymous: could not load module f90tojl... . Anyone cares to enlighten me? I got the sneaky sense I'm doing something silly Thanks in advance, V.