#python #linker #fortran #libraries #f2py
#python #компоновщик #fortran #библиотеки #f2py
Вопрос:
Я использую библиотеку, написанную М. Виммером, для вычисления пфаффианов.
У меня есть большой код на python, в котором я вызываю функцию из пакета pfaffian.
Однако мне нужно вычислять эти пфаффианы много раз, поэтому я хотел бы повысить эффективность (используя профилировщик, я проверил, что вычисление пфаффиана занимает много времени).
Поэтому я хотел бы использовать инструмент f2py для вызова функций из библиотеки Fortran в коде python. Проблема в том, что мне нужна только функция skpfa, которая зависит от других функций, принадлежащих библиотеке.
Я попытался использовать инструкции из here для связи со статической библиотекой 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 : неопределенный символ: skpfa_.
У кого-нибудь есть идея, как это исправить?