gpt4 book ai didi

gcc - 使用 iso_c_binding 时重命名 Fortran 模块中的子例程

转载 作者:行者123 更新时间:2023-12-01 01:53:44 25 4
gpt4 key购买 nike

我正在使用两个 Fortran 模块。第一个包含一个子程序 foo :

module fmod1

contains

subroutine foo(i)
implicit none

integer, intent(inout) :: i

i=i+1

end subroutine foo

end module fmod1

第二个还包含一个名为 foo 的子程序。调用 foo第一个模块,重命名为 foo_first :
module fmod2
use fmod1, only : foo_first => foo

contains

subroutine foo(i)
implicit none

integer, intent(inout) :: i

i=i+2
call foo_first(i)

end subroutine foo

end module fmod2

当我用 gfortran 编译这些文件以获得两个目标文件,然后用 nm 查看它们时,我看到了预期的结果:
fmod1.o:
0000000000000020 s EH_frame1
0000000000000000 T ___fmod1_MOD_foo

fmod2.o:
0000000000000030 s EH_frame1
U ___fmod1_MOD_foo
0000000000000000 T ___fmod2_MOD_foo

然后我在编写加载第二个模块并调用 foo 的 Fortran 程序时没有问题。在其中( ___fmod2_MOD_foo ,它本身调用 ___fmod1_MOD_foo )。

当我尝试使用 iso_c_binding 从 C 程序执行相同的操作时,我的问题就出现了.我通过添加 bind(c) 来更改第二个模块到子程序:
module fmod2
use iso_c_binding
use fmod1, only : foo_first => foo

contains

subroutine foo(i) bind(c)
implicit none

integer, intent(inout) :: i

i=i+2
call foo_first(i)

end subroutine foo

end module fmod2

现在在目标文件上再次运行 nm 会给出:
fmod1.o:
0000000000000020 s EH_frame1
0000000000000000 T ___fmod1_MOD_foo

fmod2.o:
0000000000000030 s EH_frame1
0000000000000000 T _foo

即,第二个模块似乎不再需要第一个模块。当我尝试调用 foo从 C 程序的第二个模块可以明显看出,子程序,而不是调用 foo从第一个模块开始,在无限循环中调用自己。

这是一个错误,还是我在做一些我不应该做的事情?

最佳答案

当您将 BIND(C) 添加到过程时,您正在(间接)指定绑定(bind)名称,而不是编译器应用其自己的规则(包括模块名称)。

不是“第二个模块似乎不再需要第一个模块”,而是您更改了第二个模块中例程的绑定(bind)名称。您还没有触及 foo 在第一个模块中的绑定(bind)名称(由于重命名,这不是它的本地名称。)

也就是说,编译器应该知道 foo 在第一个模块中的绑定(bind)名称,通过其本地名称引用,并在对象中为调用提供正确的名称。根据其他评论者的说法,您使用的 gfortran 版本可能在这里存在错误。尝试更新的。

关于gcc - 使用 iso_c_binding 时重命名 Fortran 模块中的子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42189625/

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