두 개의 포트란 모듈을 사용하고 있습니다.iso_c_binding을 사용할 때 포트란 모듈의 서브 루틴 이름 바꾸기
module fmod1
contains
subroutine foo(i)
implicit none
integer, intent(inout) :: i
i=i+1
end subroutine foo
end module fmod1
이 두 번째도 foo_first
로 이름을 바꾼 첫 번째 모듈의 foo
를 호출 foo
라는 서브 루틴을 포함합니다 : 첫 번째 서브 루틴 foo
을 포함
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
(___fmod2_MOD_foo
, 그 자체가 ___fmod1_MOD_foo
)을 호출하는 Fortran 프로그램 작성에 문제가 없습니다.
내 문제는 iso_c_binding
을 사용하여 C 프로그램에서 동일한 작업을 수행하려고 할 때 발생합니다.
fmod1.o:
0000000000000020 s EH_frame1
0000000000000000 T ___fmod1_MOD_foo
fmod2.o:
0000000000000030 s EH_frame1
0000000000000000 T _foo
이
즉, 두 번째 모듈은 더 이상 첫 번째 모듈을 필요로하는 것 같다
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의 : 나는 서브 루틴에 bind(c)
을 추가하여 두 번째 모듈을 변경 . C 프로그램의 두 번째 모듈에서 foo
을 호출하여 실험을 시도하면 첫 번째 모듈에서 foo
을 호출하는 대신 서브 루틴이 무한 루프에서 자체 호출하고 있음이 분명해집니다.
이 버그입니까, 아니면 내가하지 말아야 할 것이 있습니까?
gfortran 5.3.0 –
bind (c, name = "foo") 또는 bind (c, name = "foo_f")를 추가하고 nm foo2.o의 출력을 볼 수 있습니까? (내 컴퓨터에서 결과는 gfortran의 버전에 따라 다릅니다 ...) – roygvib
bind (c, name = "foo_f")에서 bind (c, name = "foo")의 경우 동일한 문제가 발생합니다. 올바른 결과 : fmod2o : 0000000000000030 s EH_frame1 U ___fmod1_MOD_foo 0000000000000000 T _foo_f –