将 fftw3 与包含在 TDM-GCC-64 中的 gfortran 一起使用

use fftw3 with gfortran included in TDM-GCC-64

我正在尝试将 FFTW3gfortran 编译器一起使用,该编译器包含在 Windows 7 平台的 TDM-GCC-64 套件中。

我已从以下页面下载 "fftw-3.3.4-dll64.zip":

http://www.fftw.org/install/windows.html

我还创建了以下教程中描述的 fortran 模块:

http://www.fftw.org/doc/Defining-an-FFTW-module.html

现在,我尝试编译以下 fortrans 程序

program test

use FFTW3 

implicit none

integer N
parameter(N=4)

integer*8 plan
  double complex in, out
  dimension in(N),out(N)

  integer i

  write(*,*) 'Input array:'

  do i = 1,N,1
    in(i) = dcmplx(float(i),float(i+1))
    write(*,*) '    in(',i,') = ',in(i)
  enddo

  call dfftw_plan_dft_1d ( plan, N, in, out, FFTW_FORWARD, FFTW_ESTIMATE )

  call dfftw_execute ( plan )

  write(*,*) 'Output array:'
  do i = 1,N,1
    write(*,*) '    out(',i,') = ',out(i)
  enddo

  call dfftw_destroy_plan ( plan )

  call dfftw_plan_dft_1d ( plan, N, out, in, FFTW_FORWARD, FFTW_ESTIMATE )

  call dfftw_execute ( plan )

  write(*,*) 'Output array after inverse FFT:'
  do i = 1,N,1
    write(*,*) '    ',N,' * in(',i,') = ',in(i)
  enddo

  call dfftw_destroy_plan ( plan )

  end

我尝试编译,但弹出了一些错误消息:

dfftw_plan_dft_1d_' undefined reference todfftw_execute_ 的未定义引用' ...

编译使用的命令为:

gfortran test.f90 -ffree-form -o test_fftw.exe

我在网上上下搜索但没有找到问题的解决方案。有人可以帮我吗?谢谢!!!

你需要学习the basics of compiling and linking programs with GCC 本教程参考了 GCC C 编译器 gcc 和 C++ 编译器 g++,但 Fortran 编译器的原理相同 gfortran.

您的程序调用了未定义的函数,例如 dfftw_plan_dft_1d 在您的代码中,但在 fftw3 库中。因此你必须告诉 gfortran link 那个库和你的程序,编译后,否则找不到定义 这些功能,并且无法构建可执行文件。相反,link年龄 失败并出现您看到的 undefined reference 个错误。

您用于构建程序的命令:

gfortran test.f90 -ffree-form -o test_fftw.exe

尝试在单个命令中编译和link程序。你可以这样做, 如果您清楚地了解底层的单独编译过程 和 linking。如果你不这样做,你应该遵循先编译的更好做法, 如果成功,则 linking。您使用的命令失败于 它的 linkage 步骤因为它没有告诉 linker fftw3 库 需要(或在哪里可以找到它)所以没有尝试找到它并且 link 它。

你说你已经下载了fftw-3.3.4-dll64.zip。我想你有 将其解压缩到您系统的某个位置。假设您将其解压缩到 C:\fftw-3.3.4-dll64.

您还说您制作了一个显然正在成功使用的 FFTW3 模块。 在这种情况下,首先编译你的程序:

gfortran -c -o test.o test.f90

正在生成目标文件 test.o。选项 -c 告诉 gfortran 只编译, 而不是 link。 (您不需要指定 --ffree-form:文件扩展名 .f90 暗示它)。

下一步,link目标文件test.ofttw3库,生成可执行文件 程序 test_fftw.exe:

gfortran -o test_fftw.exe test.o -LC:\fftw-3.3.4-dll64 -lfftw3-3

linker 选项:

-LC:\fftw-3.3.4-dll64

告诉 linker 添加 C:\fftw-3.3.4-dll64(你解压缩包的地方) 到它将搜索以查找库的目录列表。 linker 选项 -lfftw3-3 告诉它 link 一个与标识符 fftw3-3 匹配的库。在 Windows 上,GCC linker 将匹配库标识符 name 与任何文件名:

libname.a   (a static library)
libname.dll (a shared library)
name.dll    (also a shared library)
name.lib    (an import library for a shared library)

因此,由于 C:\fftw-3.3.4-dll64 包含共享库 libfftw3-3.dll, linker 将在该目录中将其识别为 -lfftw3-3

所需的目录

现在,除非有其他问题,你的程序将 link 并且你将拥有 一个可执行文件 test_fftw.exe,它将 运行,前提是 libfftw3-3.dll 可以在运行时间在Windows的地方之一找到 加载程序会寻找它。