Проблема со связью статической и динамической библиотеки Фортрана с помощью f2py - PullRequest
1 голос
/ 26 марта 2019

Я использую библиотеку , написанную М. Виммером для вычисления 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 _.

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

...