The first way to compile is the good one, but gfortran is slightly changing the names of the function. You can see it by running the `nm` command :
```
$ nm simplemodule.so
0000000000000f98 T ___simplemodule_MOD_foo
```

So you have to call `__simplemodule_MOD_foo` from Julia side (yes, with one underscore less. I don't know why ...)

```
julia> ccall((:__simplemodule_MOD_foo, "simplemodule.so"), Int32, (Int32,), 3)
```

This will also lead to a segfault, as Fortran except values to be passed by reference, and not by value. So the final call is

```
julia>ccall((:__simplemodule_MOD_foo, "simplemodule.so"), Int32, (Ptr{Int32},), &3)
   6
```

Regards,
Guillaume

Andre Bieler a écrit :
tried calling a simple fortran function from julia but did not succeed:
this is the fortran code:

||
!fileName =simplemodule.f95
modulesimpleModule

contains
functionfoo(x)
  integer ::foo,x
  foo =x *2
endfunctionfoo


endmodulesimplemodule


which is then compiled with:

*gfortran simplemodule.f95 -o simplemodule.so -shared -fPIC*

and finally the julia call is:

||

ccall((:foo,"/fullPathTo/simpleMod.so"),Int32,(Int32,),3)


which then leads to the following error:

ERROR: ccall: could not find function foo in library /fullPathTo/simpleMod.so
 in anonymous at no file



when compiling with:

gfortran -c simplemodule.f95 -o simplemodule.so -shared -fPIC

i get a different error:

*ERROR: error compiling anonymous: could not load module /fullPathTo/simplemodule.so: /fullPathTo/simplemodule.so:*
*only ET_DYN and ET_EXEC can be loaded*



Can anyone tell me what I am missing?
I do realize I would not need to call fortran to multiply a variable by 2, but its a starting point..


Thanks!
Andre

Reply via email to