2013-02-17 63 views
1

我正在編譯一個名爲prog.f的fortran程序。它包含一個名爲test.inc的包含文件。 下面的這個成功運行並顯示我的包含文件被找到。我有一個prog.so文件生成。f2py與包含文件

f2py -c prog.f -m prog 

然而,當我把這個模塊從蟒蛇我收到此錯誤信息:

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

好吧,最後我不知道這一個是否會得到最終答案。我從fortran代碼中刪除了大量不必要的代碼,並使其以這種方式工作。 – Noel 2013-02-17 14:24:20

回答

3

是的,你需要包含文件。雖然我沒有測試過

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

:這可能是簡單的東西作爲。另外,您可能需要使用fortran include語句將include_file納入prog ...此外,如果您對C更熟悉,則我所知道的幾乎所有的Fortran編譯器都使用約定,即prog.F是fortran代碼,應該由fortran代碼進行預處理cpp。所以你可能也會把你的文件包含在內。

+0

謝謝mgilson。我也沒有那麼幸運。 Fortran代碼已經包含include_file的include語句。所以也許我的問題沒有與包含文件鏈接。 – Noel 2013-02-17 14:01:46

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文件所必需的。