2016-02-21 34 views
0

我正在使用f2py來包裝一些Fortran子例程。當從Python調用時,我總是使用顯式數組作爲輸入/輸出,但有幾個工作數組需要可分配。這些數組與Python沒有接口。可複製問題的一個小的測試子程序如下所示:使用內部可分配數組與f2py

subroutine test(n, x, y) 

    !f2py intent(in) n, x 
    !f2py intent(out) y 
    !f2py depend(n) x 

    integer, intent(in) :: n, x(n) 
    integer, intent(out) :: y 

    integer, allocatable :: z(:) 

    allocate(z(n)) 

    z(:) = 10 

    y = z(2) + x(1) 

end subroutine test 

每當我使用內部分配數組我得到這樣做時,「蟒蛇的setup.py發展」與NumPy的的的distutils包的輸出如下:

test.o : error LNK2019: unresolved external symbol _gfortran_runtime_error referenced in function test_ 
test.o : error LNK2019: unresolved external symbol _gfortran_runtime_error_at referenced in function test_ 
test.o : error LNK2019: unresolved external symbol _gfortran_os_error referenced in function test_ 
ASAP\lib\asap_lib.pyd : fatal error LNK1120: 3 unresolved externals 

我使用NumPy的的配置類從numpy.distutils.misc_utl和gfortran 5.2.0,mingw64時,Windows 10

,如果我直接用gfortran該程序可以編譯就好了,但是當它被迷上了f2py(或在那個過程中的某個地方)t失敗。我可以註釋掉分配行,它會進行編譯,但顯然在運行時不起作用。無論我有多少個可分配數組,總會有3個未解析的外部數據。

雖然我在這裏,但如果Fortran子例程中有寫入或打印語句,則會出現類似的鏈接錯誤。我不需要它們,如果任何人有想法,只會對調試有用。

感謝您的幫助。

更新1:

使用配置類從numpy.distutils.misc_util我看信息here at Microsoft Linker Options後添加一個額外的鏈接選項

config.add_extension('test_lib', sources, extra_link_args=['/FORCE'] 

。 '/ FORCE'是關鍵選項。打印或寫入命令仍然在Python中返回退出代碼255,但至少可分配數組似乎在工作,這是我所關心的。

看起來像一個黑客,但如果有人知道是什麼原因造成的原始問題,我可能仍然有一個更深層根源的問題,我需要解決。

+0

一個瘋狂的猜測:在你的例子中,如果你在退出子例程之前明確地釋放(z)',問題是否會持續存在? –

+0

@ ev-br這應該不重要。 –

+0

不知何故,你沒有鏈接gfortran運行時庫。當你沒有可分配的數組時,會發生什麼情況,但是在代碼中使用print語句或類似的東西?嘗試使用簡單的'f2py -c -m module_name'來製作一個簡單的dll。 –

回答

1

我有一個鏈接問題,並在f2py選項中指定compiler = mingw32修復了所有問題。