我正在使用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,但至少可分配數組似乎在工作,這是我所關心的。
看起來像一個黑客,但如果有人知道是什麼原因造成的原始問題,我可能仍然有一個更深層根源的問題,我需要解決。
一個瘋狂的猜測:在你的例子中,如果你在退出子例程之前明確地釋放(z)',問題是否會持續存在? –
@ ev-br這應該不重要。 –
不知何故,你沒有鏈接gfortran運行時庫。當你沒有可分配的數組時,會發生什麼情況,但是在代碼中使用print語句或類似的東西?嘗試使用簡單的'f2py -c -m module_name'來製作一個簡單的dll。 –