Фортран неопределенная ссылка на _ [имя подпрограммы] - PullRequest
0 голосов
/ 04 октября 2019

Я проверяю Числовые рецепты в Фортране 90 том 2 helloBessel, как написано в книге.

program helloBessel
use nrtype
use nr, ONLY: flmoon, bessj0
implicit none

integer(I4B) :: n = 200, nph = 2, jd
real(SP) :: x, frac, ans

call flmoon(n, nph, jd, frac)
write (*,*) jd
x = jd**0.25_sp
ans = bessj0(x)
write (*,*) "Hello, Bessel: ", ans
end program helloBessel

Это выдает эту ошибку:

gfortran -o bessel nr.o nrtype.o helloBessel.f90 
/tmp/cchJfVZl.o: In function `MAIN__':
helloBessel.f90:(.text+0x28): undefined reference to `flmoon_'
helloBessel.f90:(.text+0xb4): undefined reference to `bessj0_s_'
collect2: error: ld returned 1 exit status

Я пытался уменьшитьпример на всякий случай:

program helloTest
use nrtype
use nr, ONLY: test
implicit none

real(SP) :: z, t
call test(z, t)
write (*,*) t

end program helloTest

Я скомпилирую это так:

gfortran -c nr.f90
gfortran -c nrtype.f90
gfortran -o test nr.o nrtype.o helloTest.f90

Это все равно выдает эту ошибку:

/tmp/cc76cg5g.o: In function `MAIN__':
helloTest.f90:(.text+0x1a): undefined reference to `test_'
collect2: error: ld returned 1 exit status

Это проблема вкод или процедура компиляции? Что я делаю неправильно? Мой вопрос отличается от других, так как моя версия достаточно высока, чтобы не вызывать проблем, и я уже сообщаю компилятору обо всех файлах, которые не решают проблему.

Соответствующий код из модулей

MODULE nrtype
    INTEGER, PARAMETER :: I4B = SELECTED_INT_KIND(9)
    INTEGER, PARAMETER :: SP = KIND(1.0)
END MODULE nrtype
MODULE nr
INTERFACE
    SUBROUTINE test(x,y)
        USE nrtype
        REAL(SP), INTENT(IN) :: x
        REAL(SP), INTENT(OUT) :: y
    END SUBROUTINE test
END INTERFACE

INTERFACE
    SUBROUTINE flmoon(n,nph,jd,frac)
        USE nrtype
        INTEGER(I4B), INTENT(IN) :: n,nph
        INTEGER(I4B), INTENT(OUT) :: jd
        REAL(SP), INTENT(OUT) :: frac
    END SUBROUTINE flmoon
END INTERFACE

INTERFACE bessj
    FUNCTION bessj_s(n,x)
        USE nrtype
        INTEGER(I4B), INTENT(IN) :: n
        REAL(SP), INTENT(IN) :: x
        REAL(SP) :: bessj_s
    END FUNCTION bessj_s
    FUNCTION bessj_v(n,x)
        USE nrtype
        INTEGER(I4B), INTENT(IN) :: n
        REAL(SP), DIMENSION(:), INTENT(IN) :: x
        REAL(SP), DIMENSION(size(x)) :: bessj_v
    END FUNCTION bessj_v
END INTERFACE
END MODULE nr

Обновление : согласно Владимир Ф ответ, я создал test.f90,

function test(x, y)
real, intent(in) :: x
real, intent(out) :: y

y = x + 2
return
end function test

обновлен real(SP) :: z = 1, t в helloTest, скомпилирован с

gfortran -o test test.f90 nr.o nrtype.o helloTest.f90

и получил мой 3.0000 в результате. Спасибо!

1 Ответ

1 голос
/ 04 октября 2019

Нет подпрограммы test в коде, который вы показываете. Интерфейс обещает только один, но вы должны предоставить его.

Точно так же для первой ошибки вы должны фактически добавить код с реализациями flmoon, bessj0. Поиск Google показывает, что он должен быть в bessj0.f90, но я сам не могу его проверить.

...