2017-02-12 5 views
4

두 개의 포트란 모듈을 사용하고 있습니다.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을 호출하는 대신 서브 루틴이 무한 루프에서 자체 호출하고 있음이 분명해집니다.

이 버그입니까, 아니면 내가하지 말아야 할 것이 있습니까?

+0

gfortran 5.3.0 –

+0

bind (c, name = "foo") 또는 bind (c, name = "foo_f")를 추가하고 nm foo2.o의 출력을 볼 수 있습니까? (내 컴퓨터에서 결과는 gfortran의 버전에 따라 다릅니다 ...) – roygvib

+0

bind (c, name = "foo_f")에서 bind (c, name = "foo")의 경우 동일한 문제가 발생합니다. 올바른 결과 : fmod2o : 0000000000000030 s EH_frame1 U ___fmod1_MOD_foo 0000000000000000 T _foo_f –

답변

1

지금은 GCC Bug 79485입니다. 이미 매우 유사하고 매우 관련이있는 버그를보고하기 전에 (ICE with binding-name equal to the name of a use-associated procedureWrong subroutine called, clash of specific procedure name and binding-name). 안타깝게도 gfortran 개발자는 매우 적 으면서도이 문제를 아직 해결하지 못했습니다. 그들이 다른 사람들을 만나는 것을 보게되면 약간 더 높은 우선 순위로 그것을 고려할 것입니다.

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 모두 공통점이 있습니다. –