首页 > 解决方案 > 使用一个附加函数在 FORTRAN 中未定义的引用

问题描述

我在一个包含 5000 行的大文件中有以下代码。

function w_de(a)
real(dl) :: w_de, al
real(dl), intent(IN) :: a

if(.not. use_tabulated_w) then
    w_de = w_lam+wa_ppf*(1._dl-a)*alfa   !!! PLEASE JUST SEE THIS PART
else
    al=dlog(a)
    if(al.lt.a_ppf(1)) then
        w_de=w_ppf(1)                   
    elseif(al.gt.a_ppf(nw_ppf)) then
        w_de=w_ppf(nw_ppf)             
    else
        call cubicsplint(a_ppf,w_ppf,ddw_ppf,nw_ppf,al,w_de)
    endif
endif
end function w_de 

此代码工作正常,所有组件w_lam, wa_ppf, alfa, tabulated_w都在 5000 行代码中的某些地方定义。在这个问题中我们不需要它们。请看w_de = w_lam...线。

由于某些原因和一些测试问题,我将上面的代码编写为

function wq(an)
real(dl)::wq, an
wq=w_lam+wa_ppf*(1._dl-an)*alfa
end function wq

function w_de(a)
real(dl) :: w_de, al,wq
real(dl), intent(IN) :: a

if(.not. use_tabulated_w) then
    w_de = wq(a)     !! JUST SEE THIS PART
else
    al=dlog(a)
    if(al.lt.a_ppf(1)) then
        w_de=w_ppf(1)                   
    elseif(al.gt.a_ppf(nw_ppf)) then
        w_de=w_ppf(nw_ppf)             
    else
        call cubicsplint(a_ppf,w_ppf,ddw_ppf,nw_ppf,al,w_de)
    endif
endif
end function w_de 

但是编译第二种形式的代码会出错

/tmp/ipo_ifortqAvaYt3.o: In function `lambdageneral_mp_w_de_':
ipo_out3.f:(.text.hot00005+0xdbe): undefined reference to `wq_'
....
make: *** [camb] Error 1

我不明白是什么问题。谢谢

标签: functioncompiler-errorsfortranfortran95

解决方案


推荐阅读