Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将fftw3与TDM-GCC-64中包含的gfortran一起使用_Fortran_Gfortran_Fftw - Fatal编程技术网

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

将fftw3与TDM-GCC-64中包含的gfortran一起使用,fortran,gfortran,fftw,Fortran,Gfortran,Fftw,我正在尝试将FFTW3与Windows 7平台中的TDM-GCC-64套件中包含的gfortran编译器一起使用 我已从以下页面下载了“fftw-3.3.4-dll64.zip”: 我还创建了以下教程中描述的fortran模块: 现在,我试着编译下面的fortrans程序 program test use FFTW3 implicit none integer N parameter(N=4) integer*8 plan double complex in, out di

我正在尝试将
FFTW3
与Windows 7平台中的
TDM-GCC-64
套件中包含的
gfortran
编译器一起使用

我已从以下页面下载了“fftw-3.3.4-dll64.zip”:

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

现在,我试着编译下面的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\u平面图\u dft\u 1d\u的引用
对
dfftw\u execute\u的未定义引用

用于编译的命令是:

gfortran test.f90-自由格式-o test_fftw.exe

我上下搜索网页,但没有找到解决问题的方法。有人能帮我吗?谢谢

你需要学习 本教程是指GCC C编译器, GCC ,C++编译器,G++< /C> >,但FORTRAN编译器的原理是相同的:<代码> Gfortran < /C> > 程序调用未定义的函数,如
dfftw\u plan\u dft\u 1d
在您的代码中,但在
fftw3
库中。因此,您必须告诉
gfortran
要将该库与您的程序链接,请在编译后执行,否则将找不到该库的定义 这些函数,并且无法生成任何可执行文件。相反,这种联系 由于您看到的
未定义引用
错误而失败

用于生成程序的命令:

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.o
fttw3
库链接,以生成一个可执行文件 程序
test\u 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链接器 将库标识符
名称
与任何文件名匹配:

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

现在,除非有其他问题,否则程序将链接,并且 如果
libfftw3-3.dll

在运行时,可以在其中一个

中找到这个答案,对我也很有帮助。但是我有一个问题,通过使用上面的命令(gfortran-o test\u fftw.exe test.o-LC:\fftw-3.3.4-dll64-lfftw3-3),我们是否隐式地为fftw算法启用多线程?