Я использую 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 разработки» с Distutils пакетом Numpy в:
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 есть оператор записи или печати. Мне они не нужны, они просто будут полезны для отладки, если у кого-то есть идея.
Спасибо за помощь.
UPDATE 1:
Использование класса конфигурации с numpy.distutils.misc_util я добавил дополнительный пункт ссылку
config.add_extension('test_lib', sources, extra_link_args=['/FORCE']
посмотрев на информацию here at Microsoft Linker Options. Параметр «/ FORCE» является ключевым. Команда print или write все еще отбрасывает код выхода 255 в Python, но по крайней мере распределяемые массивы, похоже, работают, и это все, о чем я заботился.
Кажется, что это взломать, но если кто-то знает, что вызывает исходную проблему, у меня, вероятно, все еще есть более глубокая проблема, которую мне нужно решить.
Дикое предположение: в вашем примере проблема сохраняется, если вы явно «освобождаете (z)» перед выходом из подпрограммы? –
@ ev-br Это не имеет значения. –
Как-то вы не связываете библиотеку времени исполнения gfortran. Что происходит, когда у вас нет распределяемых арабов, но заявление печати или что-то подобное в коде? Попробуйте сделать простую dll с простым 'f2py -c -m module_name'. –