我有一個Fortran模塊,我試圖用f2py編譯(下面列出)。當我刪除模塊聲明並將它自己的子例程留在文件中時,一切正常。但是,如果模塊聲明如下,我得到以下結果:使用f2py編譯fortran模塊
> f2py.py -c -m its --compiler=mingw itimes-s2.f
...
Reading fortran codes...
Reading file 'itimes-s2.f' (format:fix,strict)
crackline: groupcounter=1 groupname={0: '', 1: 'module', 2: 'interface', 3: 'subroutine'}
crackline: Mismatch of blocks encountered. Trying to fix it by assuming "end" statement.
...
c:\users\astay13\appdata\local\temp\tmpgh5ag8\Release\users\astay13\appdata\local\temp\tmpgh5ag8\src.win32-3.2\itsmodule.o:itsmodule.c:(.data+0xec): undefined reference to `itimes_'
collect2: ld returned 1 exit status
在f2py中編譯模塊或子例程有什麼不同?我是否在模塊中留下了一些導致f2py有問題的重要內容?請注意,當我單獨使用gfortran時,該模塊編譯得很好。
軟件:Windows 7; gcc,gfortran 4.6.1(MinGW); python 3.2.2; f2py V2
itimes-s2.f:
module its
contains
subroutine itimes(infile,outfile)
implicit none
! Constants
integer, parameter :: dp = selected_real_kind(15)
! Subroutine Inputs
character(*), intent(in) :: infile
character(*), intent(in) :: outfile
! Internal variables
real(dp) :: num
integer :: inu
integer :: outu
integer :: ios
inu = 11
outu = 22
open(inu,file=infile,action='read')
open(outu,file=outfile,action='write',access='append')
do
read(inu,*,IOSTAT=ios) num
if (ios < 0) exit
write(outu,*) num**2
end do
end subroutine itimes
end module its
我試着運行'f2py -c --compiler = mingw32 -m itsm itimes-s2.f',但是錯誤信息仍然是一樣的。 – astay13 2011-12-20 15:19:20
嘗試重命名文件以使其具有.f90後綴。似乎編譯器認爲它是一個固定格式的文件(至少在我的機器上)。我正在使用'f2py -c -m itsm itimes-s2.f90',它可以工作。我在2臺不同的linux電腦上測試過它。 – 2011-12-20 20:54:28
謝謝弗拉基米爾!一旦我將其重命名爲'.f90'擴展名,即使Python和Fortran模塊具有相同的名稱,它也可以很好地工作。 – astay13 2011-12-20 21:50:57