доступ к данным модуля fortran из c с помощью gfortran и gcc

Я пытаюсь получить доступ к переменным модуля в коде fortran, вызывая его из C. Я уже вызываю подпрограмму, но не могу вызвать переменные.

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

и код 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;
}

Я компилирую через

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

на который gcc отвечает неопределенной ссылкой на `aa '


person cauchy    schedule 26.07.2013    source источник
comment
Как проходит aa?   -  person Kyle Kanos    schedule 26.07.2013


Ответы (1)


Используя objdump для просмотра символов, мы видим

0000000000000000 g     O .bss   000000000000000c __mymodule_MOD_aa

Вам нужно добавить bind(C) в вашу переменную aa

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

теперь $ objdump -t fortrancode.o говорит

000000000000000c       O *COM*  0000000000000004 aa

и

#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;
}

и

$ ./myprogram 
hello world from C
 hello world from Fortran 90
1.000000 2.000000 3.000000 
person jsp    schedule 26.07.2013