将Fortran变量暴露给C

时间:2014-03-21 18:02:29

标签: 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_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

1 个答案:

答案 0 :(得分:0)

随访:

感谢M.S.B.

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

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;

gcc -c vars-ext.c和nm vars-ext.o

U c_extern
U myVariable

gfortran可以成功地将mod.o与vars.o或vars-ext.o链接起来。看起来魔术在于“C”类符号。