Binding 将Fortran变量公开给C

Binding 将Fortran变量公开给C,binding,fortran,Binding,Fortran,我学习了如何在Fortran代码中使用C全局变量,如下例所示。但是,如何以相反的方向进行,即在Fortran中定义(并初始化)一个变量,并使其可供C访问 /* C global variables */ int c_extern; long myVariable; !Fortran binding code MODULE LINK_TO_C_VARS USE ISO_C_BINDING !Implicit label binding !Bind variable C_

我学习了如何在Fortran代码中使用C全局变量,如下例所示。但是,如何以相反的方向进行,即在Fortran中定义(并初始化)一个变量,并使其可供C访问

/* C global variables */

int c_extern;
long myVariable;

!Fortran binding code
MODULE LINK_TO_C_VARS
    USE ISO_C_BINDING
    !Implicit label binding
    !Bind variable C_EXTERN to c_extern
    INTEGER(C_INT), BIND(C) :: C_EXTERN

    !Explicit label binding
    !Bind C2 to myVariable
    INTEGER(C_LONG) :: C2
    BIND(C, NAME='myVariable') :: C2
END MODULE LINK_TO_C_VARS
后续行动:

多亏了工商管理硕士

我做了一些实验。我把C代码放在vars.C中,把Fortran代码放在mod.f90中

gcc -c vars.c
nm vars.o
0000000000000004 C c_extern
0000000000000008 C myVariable

gfortran -c mod.f90
nm mod.o
0000000000000004 C c_extern
0000000000000008 C myVariable
“man nm”上写着:“C”——这个符号很常见。公共符号是未初始化的数据。链接时,可能会出现多个具有相同名称的公共符号。如果在任何地方定义了符号,则公共符号将被视为未定义的引用

然后,我将vars.c中的变量更改为extern

<<vars-ext.c>>
extern int c_extern;
extern long myVariable;

gfortran可以成功地将mod.o链接到vars.o或vars-ext.o。看起来,神奇之处在于“C”类符号。

Fortran和C之间共享的全局变量可以用任何一种语言的代码修改。由此产生的更改将显示给其他语言可见的变量。它在两个方向都起作用。如果您有特定的问题,请显示所有相关的代码。您的代码工作正常,只需编译它
gcc-shared vars.c mod.f90-o lib.so
,库中包含这些变量。此语句“INTEGER(c_INT),BIND(c)::c_EXTERN”会在生成的.o对象中分配变量吗?我不知道是谁分配内存,C还是Fortran。这没关系。通过ISO_C_绑定,Fortran“知道”Fortran变量与C变量相同。可执行文件只保留了一个存储。兼容的Fortran/C编译器对解决了这一问题。对MSB的最后一个选项稍加修改,即BIND(C)告诉Fortran变量可与C互操作。ISO_C_绑定的使用本身与此无关。
U c_extern
U myVariable