使用fftw3和TDM-GCC-64中包含的gfortran

时间:2015-10-05 18:06:10

标签: fortran gfortran fftw

我正在尝试将FFTW3与{7}}套件中包含的gfortran编译器一起使用。

我已下载" 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程序

TDM-GCC-64

我尝试编译,但弹出了几条错误消息:

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_execute _'的未定义引用 ...

用于编译的命令是:

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

我上下搜索网页,但没有找到问题的解决方案。谁能帮到我这里?感谢!!!

1 个答案:

答案 0 :(得分:1)

您需要了解the basics of compiling and linking programs with GCC 本教程涉及GCC C编译器gcc和C ++编译器g++,但Fortran编译器的原则是相同的,gfortran

您的程序会调用未定义的dfftw_plan_dft_1d等函数 在您的代码中,但在fftw3库中。因此,您必须告诉gfortran 在编译之后链接该程序库与您的程序,或者找不到定义 这些函数,不能构建任何可执行文件。相反,联系 因您看到的undefined reference错误而失败。

您用于构建程序的命令:

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

尝试在单个命令中编译和链接程序。你可以这样做, 如果你清楚地理解了潜在的独立编译过程 和链接。如果你不这样做,你应该遵循先编译的更好的做法, 如果成功,那么链接。您使用的命令失败了 它的链接步骤是因为它没有告诉链接器fftw3库 需要(或在哪里找到它)所以没有尝试找到它并链接它。

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

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

gfortran -c -o test.o test.f90

生成目标文件test.o。选项-c告诉gfortran仅编译, 而不是链接。 (您无需指定--ffree-form:文件扩展名.f90 意味着它。)

接下来,将目标文件test.ofttw3库链接,以生成可执行文件 程序test_fftw.exe

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

链接器选项:

-LC:\fftw-3.3.4-dll64

告诉链接器添加C:\fftw-3.3.4-dll64(解压缩包的位置) 到它将搜索以查找库的目录列表。链接器选项-lfftw3-3告诉它链接与标识符fftw3-3匹配的库。在Windows上,GCC链接器 将库标识符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, 链接器将在该目录中将其标识为-lfftw3-3

所需的目录

现在,除非有其他问题,否则您的程序将链接,您将拥有 一个可执行文件test_fftw.exe,只要libfftw3-3.dll运行,它就会运行 可以在运行时在the places where the Windows loader will look for it.

之一中找到