使用iso_c_binding时重命名Fortran模块中的子程序

4

我正在使用两个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

我没有问题编写一个Fortran程序来加载第二个模块并调用其中的foo___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

即第二个模块似乎不再需要第一个模块。当我尝试在C程序中从第二个模块调用foo时,子程序调用自身进入无限循环,而不是从第一个模块调用foo
这是一个错误吗?还是我做了一些不该做的事情?

这是gfortran 5.3.0。 - fabiano.corsetti
你能否尝试添加bind(c,name="foo")或bind(c,name="foo_f"),并查看nm foo2.o的输出?(在我的电脑上,结果取决于gfortran的版本...) - roygvib
对于绑定(c,name =“foo”),我得到相同的有问题的结果,而对于绑定(c,name =“foo_f”),我得到了正确的结果:fmod2.o: 0000000000000030 s EH_frame1 U ___fmod1_MOD_foo 0000000000000000 T _foo_f - fabiano.corsetti
1
我在mac10.11上使用gfortran6.3也遇到了同样的问题。有趣的是,使用较旧的gfortran4.8(在Linux系统上)时,bind(c)(如问题中所述)可以正常工作。另一方面,ifort-16和oracle studio fortran 12.5适用于所有模式。...嗯 - roygvib
2个回答

2
当您在过程中添加BIND(C)时,您正在指定(间接地)绑定名称,而不是编译器应用其自己的规则(包括模块名称)。
并不是"第二个模块似乎不再需要第一个模块",而是您已更改第二个模块中例程的绑定名称。您没有触及第一个模块中foo的绑定名称(由于重命名,它不是其本地名称)。
话虽如此,编译器应该知道通过其本地名称引用第一个模块中foo的绑定名称,并在调用对象中输出正确的名称。根据其他评论者所说,您使用的gfortran版本可能存在错误。尝试使用更新的版本。

4
我已经报告了几个类似的问题。它们始于 gfortran 4.9,但尚未得到修复。https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66695 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77746 它们可能有一个共同的起源。 - Vladimir F Героям слава

1

状态:已修复(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79485) - MuellerSeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接