1

prog.f という Fortran プログラムをコンパイルしています。これには、test.inc という名前のインクルード ファイルが含まれています。以下は正常に実行され、インクルード ファイルが見つかったことを示しています。prog.so ファイルが生成されました。

f2py -c prog.f -m prog

ただし、Python からこのモジュールを呼び出すと、次のエラー メッセージが表示されます。

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import prog
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./prog.so: undefined symbol: unknown_function_

コンパイルの引数に何か関係があると思いますが、Fortran にはあまり詳しくありません。インクルード ファイルも含める必要がありますか? もしそうなら、どのように?

4

2 に答える 2

3

はい、インクルードファイルが必要です。それは次のような単純なものかもしれません:

f2py -c include_file.f prog.f -m prog

私はそれをテストしていませんが。あるいは、fortranincludeステートメントを使用include_fileしてprog...に含める必要がある場合もあります。また、Cに精通している場合、私が知っている事実上すべてのFortranコンパイラーは、prog.Fによって前処理されるFortranコードの規則を使用しcppます。したがって、おそらくその方法でファイルを含めることもできます。

于 2013-02-17T12:05:08.177 に答える
2

私もこの問題に遭遇し、現在の f2py は #include ステートメントや条件付きコンパイルなどのファイルの前処理をサポートしていないと単純に述べている他の議論を見つけることができました。 https://groups.google.com/forum/#!topic/f2py-dev/aW65sEoSdG8

http://mail.scipy.org/pipermail/numpy-discussion/2009-November/046381.html

2 つの解決策: 最も簡単: gfortran を使用してコードをコンパイルしている場合は、.f90 または .f ファイルの名前を .F90 または .F に変更します。大文字のキー gfortran を使用すると、(指定しなくても) プリプロセッサが自動的に使用されます。

2 番目: Fortran コンパイラを使用してファイルを前処理し、結果を中間 Fortran コードとして保存して f2py に送信します。

gfortran -E -D<Defines-for-compiler> file.f -cpp  -o outdir/file.f

ここで、-E は gfortran にファイルの前処理のみを行うように指示するコマンド (コンパイラによって異なる場合があります) であり、前処理中に使用する値を定義する -D オプションです。

元の .f ファイルが上書きされないようにするには、ファイルを別のディレクトリに保存する (または名前を完全に変更する) 必要があります。

于 2014-03-05T12:19:37.243 に答える