0

Pythonで使用するために、f2pyでFortran f90ファイルをコンパイルしようとしています。ファイルは、別のファイルからモジュールを呼び出すサブルーチンです。モジュールは基本的に割り当て用です。コマンド ウィンドウで「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

インターネットを検索するなど、数日間これを解決しようとしましたが、役に立ちませんでした。誰にもアイデアはありますか?それは非常に単純な問題かもしれません。助けてくれてありがとう。

編集:モジュールをコピーしてサブルーチンと同じファイルに貼り付ければ動作しますが、別のファイルとして動作させるとよいでしょう。

4

1 に答える 1

2

この説明がすでに知っている範囲をカバーしている場合はすみませんが、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_initのコンパイル済みバージョンを提供せずにコンパイルしようとした場合に表示されると予想されるものです。my_decなどの名前__my_dec_MOD_iaprocはコンパイラによって生成されます。その名前iaprocは、MODule my_dec. my_decがまったく定義されていない場合は、同様のメッセージが表示iaprocされますが、ここではそうではありません。

f2py(ほとんどの場合)別のモジュールまたはサブプログラムまたはプログラムによるモジュールが最初にコンパイルされることを確認する必要があるだけでused、リンカーはその魔法を実行します(パスが設定されている場合など)。

f2pyのコンパイル済みバージョンを探す場所をどのように伝えているのかわかりませんmy_dec

そして、編集で解決策を見つけたことがわかりました。別のファイルにサブルーチンのソースがあると便利だと思う理由がわかりません。本当に Fortran 90 サブルーチンを作成しようとしている場合は、モジュールにも属します。

于 2012-07-30T10:23:21.230 に答える