如何在 f2py 中使用 FFTW3 link?

How to link with FFTW3 in f2py?

我正在尝试为我前段时间编写的 Python 实现加速,并决定为此使用 f2py。我目前仍在测试一些东西,并认为我需要一些帮助才能使 FFTW3 正常工作。对于第一个测试,我编写了以下子例程:

subroutine initFFT(planF, a, res, n)
    implicit none
    include "fftw3.f"
    integer, INTENT(IN) :: n
    complex(KIND=8), dimension(n) :: a, res
    integer(KIND=8), intent(OUT) :: planF

    call dfftw_plan_dft(planF, 1, n, a, res, FFTW_FORWARD, FFTW_MEASURE)
end subroutine initFFT

subroutine operation(a, res, n, planF)
    implicit none
    INCLUDE 'fftw3.f'
    integer :: n
    integer(KIND=8) :: planF
    complex(KIND=8), dimension(n), intent(IN) :: a
    complex(KIND=8), dimension(n), intent(OUT) :: res

    call dfftw_execute_dft(planF, a, res)
end subroutine operation

我用一个简单的主程序测试了这个

program test
    implicit none
    integer, parameter :: n = 3
    integer(KIND=8) :: planF
    complex(KIND=8), dimension(n) :: res, a

    call initFFT(planF, a, res, n)

    a = (/ 1., 1., 1./)
    call operation(a, res, n, planF)
end program test

并用

编译
gfortran -o ftest myFun.f90 -L/usr/lib -lfftw3 -I/usr/include

一切正常并返回正确的结果。现在我尝试通过以下方式将其与 f2py 一起使用:

f2py -c myFun.f90 -m modf --f90flags="-L/usr/lib -lfftw3 -I/usr/include"

问题是,当我尝试在 Python 中导入创建的模块(使用 import modf)时,我收到以下错误消息:

Import Error: modf.so undefined symbol: dfftw_execute_dft_

我已经在 Google 上花了很多时间,但到目前为止我还没有发现任何有用的东西。有谁知道如何解决这个问题?

你能尝试直接使用 f2py 的标志而不是通过 --f90flags 吗?

目前,您告诉 fortran 编译器如何构建模块,但 f2py 对链接步骤一无所知。您需要的是最终 Python 可调用模块知道 fftw 的存在。

f2py -c -L/usr/lib -lfftw3 -I/usr/include -m modf myFun.f90

根据 https://docs.scipy.org/doc/numpy/f2py/usage.html

,选项在 Fortran 文件名之前给出