Я использую библиотеку , написанную М. Виммером для вычисления pfaffians.
У меня большой код на python, в котором я вызываю функцию из пакета pfaffian.
Однако мне нужно многократно вычислять эти pfaffians, поэтому я хотел бы повысить эффективность (с помощью профилировщика я проверил, что вычисление pfaffian занимает много времени).
Поэтому я хотел бы использовать инструмент f2py для вызова функций из библиотеки Фортрана в коде Python.Проблема в том, что мне нужна только функция skpfa, которая зависит от других функций, которые принадлежат библиотеке.
Я пытался использовать инструкции из здесь для связи со статической библиотекой libpfapack.a, однако при импорте модуля вывода (который я назвал pfaf.so) я получил сообщение об ошибке:
./pfaf.so: undefined symbol: skpfa_
Я прочитал, что проблема может заключаться в том, что я хочу связать статическую библиотеку, поэтому я создал динамическую библиотеку из предоставленных источников, используя команду:
gfortran -O3 -fimplicit-none -c -fPIC file.f -o file.o
для всех исходных файлов,а затем
gfortran -shared $(OBJECTS) -o libpfapack
Я создал следующий файл подписи pfaf.pyf:
python MODULE pfaffian
PUBLIC
INTERFACE
SUBROUTINE SKPFA(A, PFSFF, UPLO, MTHD, INFO)
double precision, intent(in) :: A(:,:)
double precision, intent(inout) :: p
character, intent(in), optional :: UPLO, MTHD
integer, intent(out), optional :: info
end subroutine skpfa
end interface
end python module pfaffian
, и я вызвал:
f2py -c --lower --fcompiler=gnu95 pfaf.pyf -L{path to directory with libpfapack} -lpfapack
, и я получил сообщение
/usr/bin/ld: cannot find -lpfapack
Если я вызываю команду f2py без -lpfapack, все скомпилируется и создаст файл pfaf.so, однако я получаю ошибку в python:
. / Pfaf.so: undefined символ:skpfa _.
У кого-нибудь есть идеи как это исправить?