f2py的问题:未定义的子程序中的模块引用

我正在尝试用f2py编译Fortran f90文件,以便在Python中使用。 该文件是从另一个文件调用模块的子例程。 该模块基本上用于分配。 我可以在命令窗口中使用'gfortran my_dec.f90'来编译模块,但在编译子例程文件时出现错误。 这特别困难,因为我几乎没有使用Fortran,而这是别人的代码。

这里是模块和子程序的一部分,因为它很长,包括它的开始和结束:

 module my_dec

    integer ndir, nfreq
    integer ihmax,ier
    integer nk,nth,nspec


    real hspmin
    real wsmult
    real wscut

    logical flcomb, flc 

    parameter(ndir=24)
    parameter(nfreq=23)

    parameter(nk=nfreq)
    parameter(nth=ndir)
    parameter(nspec=nk*nth)

    REAL DTH, SIG(0:nk+1), DSII(0:nk+1), DSIP(0:nk+1)
    REAL ECOS(nspec+nth), ESIN(nspec+nth), XFR 
    REAL FACHFE, TH(nth), FTE

    REAL ES2(nspec+NTH),EC2(nspec+NTH),ESC(nspec+NTH)
    REAL DDEN(NK),DDEN2(nspec)
    REAL SIG2(nspec)

    INTEGER IAPROC, NAPERR, NDSE, NDST

    INTEGER year, TIME 

    real pcg ! percentage either side of peakfor gamma estimate

    data pcg/0.3/ 

end module my_dec

子程序:

子程序my_init

use my_dec
use constants

iaproc=1
naperr=1
ndset=1
ndst=1

IHM    = 100
HSPM   = 0.05
WSM    = 1.7
WSC    = 0.333
FLC    = .true.


IHMAX  = MAX ( 50, IHM )
HSPMIN = MAX ( 0.0001 , HSPM )
WSMULT = MAX ( 1. , WSM )
WSCUT  = MIN ( 1.0001 , MAX ( 0. , WSC ) )
FLCOMB = FLC

...      

    return

    end

当我尝试使用'f2py -c my_init.f90 -m my_init_m'编译子例程文件'my_init.f90'时,我在子例程中得到了一大堆关于模块变量的消息:

c:userslwlappdatalocaltemptmptlve6zReleasemy_init.o:my_init.f90:(.text+0
xb): undefined reference to `__my_dec_MOD_iaproc'
c:userslwlappdatalocaltemptmptlve6zReleasemy_init.o:my_init.f90:(.text+0
x15): undefined reference to `__my_dec_MOD_naperr'
c:userslwlappdatalocaltemptmptlve6zReleasemy_init.o:my_init.f90:(.text+0
x26): undefined reference to `__my_dec_MOD_ndst'
c:userslwlappdatalocaltemptmptlve6zReleasemy_init.o:my_init.f90:(.text+0
x4f): undefined reference to `__my_dec_MOD_flc'

然后是这个错误,这对我来说并不多见:

collect2: ld returned 1 exit status
error: Command "C:Python27Scriptsgfortran.exe -Wall -Wall -shared c:userslw
lappdatalocaltemptmptlve6zReleaseuserslwlappdatalocaltemptmptlve6zsr
c.win-amd64-2.7my_init_mmodule.o c:userslwlappdatalocaltemptmptlve6zRele
aseuserslwlappdatalocaltemptmptlve6zsrc.win-amd64-2.7fortranobject.o c:
userslwlappdatalocaltemptmptlve6zReleasemy_init.o -Lc:python27egg-info
mingwusrlibgccx86_64-w64-mingw324.5.2 -LC:Python27libs -LC:Python27PCbu
ildamd64 -lpython27 -lgfortran -o .my_init_m.pyd" failed with exit status 1

我一直在努力工作几天,包括搜索互联网,但无济于事。 有人有主意吗? 这可能是一个相当简单的问题。 谢谢你的帮助。

编辑:如果我将模块复制并粘贴到与子例程相同的文件中,我已经使用它,但是将它作为单独文件工作会很好。


不好意思,如果这个解释涵盖你已经知道的理由,但你确实写道你几乎不了解Fortran。

您的例程my_init使用名为my_dec的模块(和一个称为constants )。 这就是use声明所陈述的。 错误消息如

c:userslwlappdatalocaltemptmptlve6zReleasemy_init.o:my_init.f90:(.text+0
xb): undefined reference to `__my_dec_MOD_iaproc'

是什么,我希望看到,如果你试图编译my_init不提供的编译版本my_dec链接。 名称如__my_dec_MOD_iaproc是由编译器产生的,你可以阅读该名称作为识别称为实体iaprocMODule my_dec 。 如果my_dec根本没有定义iaproc ,你会得到一个类似的消息,但这不是这种情况。

除了f2py之外(大多数情况下),只需确保先编译由另一个模块或子程序或程序used的任何模块,链接器将发挥它的魔力(提供的路径已设置等等)。

我不知道你是怎么告诉f2py到哪里寻找的编译版本my_dec

而且我看到你现在已经在编辑中找到了解决方案。 我对你为什么认为将子程序的源代码放在单独的文件中感到困惑不解。 如果你真的想写Fortran 90子程序也属于模块。

链接地址: http://www.djcxy.com/p/96133.html

上一篇: Problems with f2py: undefined references to module in subroutine

下一篇: bcrypt@1.0.3 install: `node