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_fileprog... 此外,如果您更熟悉 C,我所知道的几乎所有 fortran 编译器都使用prog.F应该由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

两种解决方案: 最简单:如果您使用 gfortran 编译代码,请将任何 .f90 或 .f 文件重命名为 .F90 或 .F。使用大写字母键 gfortran 自动使用预处理器(即使您没有指定)。

第二:使用您的 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 回答