我正在使用两个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
。这是一个错误吗?还是我做了一些不该做的事情?
fmod2.o: 0000000000000030 s EH_frame1 U ___fmod1_MOD_foo 0000000000000000 T _foo_f
- fabiano.corsetti