我正在编译一个名为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不太熟悉。我是否还需要包含我的包含文件?如果是这样的话?
答案 0 :(得分:3)
是的,您需要包含文件。它可能很简单:
f2py -c include_file.f prog.f -m prog
虽然我没有测试过。或者,您可能需要使用fortran include
语句将include_file
包含到prog
中...此外,如果您对C更熟悉,几乎所有我知道的fortran编译器都使用prog.F
是应由cpp
预处理的fortran代码的约定。所以你可能也会以这种方式包含你的文件。
答案 1 :(得分: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编译器预处理文件,并将结果保存为要发送到f2py的中间Fortran代码。
gfortran -E -D<Defines-for-compiler> file.f -cpp -o outdir/file.f
其中-E是告诉gfortran只预处理文件的命令(可能因编译器而异),-D选项用于定义在预处理期间使用的任何值。
为避免覆盖原始.f文件,必须将文件保存到另一个目录(或完全更改名称)。