Проблема со связыванием статической и динамической библиотеки Fortran с помощью f2py

#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_.

У кого-нибудь есть идея, как это исправить?