Access tr module data from c using gfortran and gcc

I am trying to access the module variables in fortran code by calling it from C. I already call the subroutine, but I can not call the variables.

module myModule use iso_c_binding implicit none real(C_FLOAT) aa(3) contains subroutine fortranFunction() bind(C) print *,"hello world from Fortran 90" aa(1)=1.0; aa(2)=2.0; aa(3)=3.0; end subroutine end module 

and code C

 #include "stdio.h" extern void fortranfunction(); extern float mymodule_aa_[3]; int main() { printf("hello world from C\n"); fortranfunction(); printf("%f %f %f \n",aa[0],aa[1],aa[2]); return 0; } 

I compile through

 gcc -c ccode.c gfortran -c fortrancode.f90 gcc fortrancode.o ccode.o -lgfortran -o myprogram 

to which gcc responds with an undefined reference to `aa '

+4
source share
1 answer

Using objdump to view characters, we see

 0000000000000000 g O .bss 000000000000000c __mymodule_MOD_aa 

You need to add bind(C) to your aa variable

 module myModule use iso_c_binding implicit none real(C_FLOAT), bind(C) :: aa(3) contains subroutine fortranFunction() bind(C) print *,"hello world from Fortran 90" aa(1)=1.0; aa(2)=2.0; aa(3)=3.0; end subroutine end module 

now $ objdump -t fortrancode.o says

 000000000000000c O *COM* 0000000000000004 aa 

and

 #include "stdio.h" extern void fortranfunction(); extern float aa[3]; int main() { printf("hello world from C\n"); fortranfunction(); printf("%f %f %f \n",aa[0],aa[1],aa[2]); return 0; } 

and

 $ ./myprogram hello world from C hello world from Fortran 90 1.000000 2.000000 3.000000 
+7
source

Source: https://habr.com/ru/post/1493721/


All Articles