gpt4 book ai didi

binding - 将 Fortran 变量公开给 C

转载 作者:行者123 更新时间:2023-12-02 16:42:00 24 4
gpt4 key购买 nike

我学习了如何在 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

最佳答案

后续:

感谢 M.S.B.

我做了一些实验。我将 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”——该符号是通用的。公共(public)符号是未初始化的数据。链接时,可能会出现多个具有相同名称的通用符号。如果符号在任何地方定义,则公共(public)符号将被视为 undefined reference 。

然后,我将 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”类符号。

关于binding - 将 Fortran 变量公开给 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22566236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com