我正在尝试将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
我上下搜索网页,但没有找到问题的解决方案。谁能帮到我这里?感谢!!!
答案 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.o
与fttw3
库链接,以生成可执行文件
程序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.