我正在尝试用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:\users\lwl\appdata\local\temp\tmptlve6z\Release\my_init.o:my_init.f90:(.text+0
xb): undefined reference to `__my_dec_MOD_iaproc'
c:\users\lwl\appdata\local\temp\tmptlve6z\Release\my_init.o:my_init.f90:(.text+0
x15): undefined reference to `__my_dec_MOD_naperr'
c:\users\lwl\appdata\local\temp\tmptlve6z\Release\my_init.o:my_init.f90:(.text+0
x26): undefined reference to `__my_dec_MOD_ndst'
c:\users\lwl\appdata\local\temp\tmptlve6z\Release\my_init.o:my_init.f90:(.text+0
x4f): undefined reference to `__my_dec_MOD_flc'然后是错误,这对我没有太大的启示:
collect2: ld returned 1 exit status
error: Command "C:\Python27\Scripts\gfortran.exe -Wall -Wall -shared c:\users\lw
l\appdata\local\temp\tmptlve6z\Release\users\lwl\appdata\local\temp\tmptlve6z\sr
c.win-amd64-2.7\my_init_mmodule.o c:\users\lwl\appdata\local\temp\tmptlve6z\Rele
ase\users\lwl\appdata\local\temp\tmptlve6z\src.win-amd64-2.7\fortranobject.o c:\
users\lwl\appdata\local\temp\tmptlve6z\Release\my_init.o -Lc:\python27\egg-info\
mingw\usr\lib\gcc\x86_64-w64-mingw32\4.5.2 -LC:\Python27\libs -LC:\Python27\PCbu
ild\amd64 -lpython27 -lgfortran -o .\my_init_m.pyd" failed with exit status 1我已经尝试了几天,包括在互联网上搜索,但都无济于事。有谁有什么想法吗?这可能是一个非常简单的问题。谢谢你的帮助。
编辑:如果我将模块复制并粘贴到与子例程相同的文件中,我可以让它工作,但如果它能作为单独的文件与它们一起工作,那就更好了。
发布于 2012-07-30 18:23:21
对不起,如果这个解释涵盖了您已经知道的领域,但您确实写道您几乎不了解Fortran。
您的例程my_init使用名为my_dec的模块(以及名为constants的模块)。这就是use语句声明的内容。错误消息,如
c:\users\lwl\appdata\local\temp\tmptlve6z\Release\my_init.o:my_init.f90:(.text+0
xb): undefined reference to `__my_dec_MOD_iaproc'如果您试图在不提供可链接的编译版本的my_dec的情况下编译my_init,我希望看到的就是这些。诸如__my_dec_MOD_iaproc之类的名称是由编译器生成的,您可以将该名称读取为在MODule my_dec中标识一个名为iaproc的实体。如果my_dec根本没有定义iaproc,您会收到类似的消息,但这里的情况并非如此。
抛开f2py不谈,你(在大多数情况下)只需确保任何被另一个模块或子程序或程序执行used的模块首先被编译,链接器就会施展它的魔力(假设设置了路径等等)。
我不知道如何告诉f2py在哪里可以找到编译后的my_dec版本。
我看到你已经在你的编辑中找到了解决方案。我不明白为什么您认为将子例程的源代码放在单独的文件中会更好。如果你真的想写Fortran 90,那么子例程也应该包含在模块中。
https://stackoverflow.com/questions/11719229
复制相似问题