将静态和动态Fortran库与f2py

时间:2019-03-26 11:39:38

标签: python linker fortran libraries f2py

我正在使用M. Wimmer写的library来计算pfaffians。

我在python中有很大的代码,在其中我从pfaffian包中调用该函数。

但是,我需要多次计算这些pfaffian,因此我想提高效率(使用探查器检查了pfaffian的计算会消耗大量时间)。

因此,我想使用f2py工具以python代码从Fortran库中调用函数。问题是,我只需要函数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

如果我在不带-lpfapack的情况下调用f2py命令,则这些东西会编译并生成文件pfaf.so,但是我在python中遇到错误:

  

./ pfaf.so:未定义符号:skpfa _。

有人知道如何解决吗?

0 个答案:

没有答案