I'm trying to use a fortran module subroutine in c and cannot get through, here is a simplified version of my problem:
I have one fortran module that contains a subroutine, and the second subroutine uses the module.
!md.f90
module myadd
implicit none
contains
subroutine add1(a) bind(c)
implicit none
integer a
a=a+1
end subroutine add1
end module myadd
!sb.f90
subroutine sq(a) bind(c)
use myadd
implicit none
integer a
call add1(a)
a=a*a
end subroutine sq
Now I want to call the sb
function in c:
//main.cpp
extern "C"{ void sb(int * a); }
int main(){
int a=2;
sb(&a);
}
how should I link them together?
I tried something like
ifort -c md.f90 sb.f90
icc sb.o main.cpp
but it gives error
sb.o: In function
sq': sb.f90:(.text+0x6): undefined reference to
add1' /tmp/icc40D9n7.o: In functionmain': main.cpp:(.text+0x2e): undefined reference to
sb'
Does anyone know how to solve the problem?
int main(void){
int a=2;
sb(&a);
return 0;
}
and
module myadd
use iso_c_binding
implicit none
contains
subroutine add1(a) bind(c)
implicit none
integer (c_int),intent (inout) :: a
a=a+1
end subroutine add1
end module myadd
!sb.f90
subroutine sq(a) bind(c, name="sb")
use iso_c_binding
use myadd
implicit none
integer (c_int), intent(inout) :: a
call add1(a)
a=a*a
end subroutine sq
with
gcc -c main.c
gfortran-debug fort_subs.f90 main.o
It is easier to link with the Fortran compiler because it brings in the Fortran libraries.