http://ingar.satgnu.net/devenv/mingw32/base.html
1.在点击打开链接下载MinGW,运行点击安装。
下一步设置安装路径,点击continue,安装完成后点击continue,完成MinGW Installation Manager安装。
下一步安装MSYS package:
点击MinGW Installation Manager,可以选择默认的安装,不过本次只需要MinGW64,所以只需装msys-base,将前面的方框标记,打开Installation菜单点击Apply Changes,点击Apply按钮,安装完成后点击close,接下来安装一些额外的包:选择All Packages菜单,标记下列包:
然后安装(同前面)。
打开安装目录,找到msys\1.0\msys.bat,创建桌面快捷方式,点击快捷方式右键属性,将
点击ok。
2.安装MinGW-w64
在点击打开链接下载x86_64-4.9.2-release-posix-seh-rt_v3-rev0.7z安装包,解压到前述的安装目录中。
3.配置msys和MinGW-w64:
在msys\1.0\etc中找到profile文件并打开,将其中的PATH加入(前述安装目+mingw64/bin(前述解压后的bin文件夹))保存,退出msys,重新打开msys,输入g++ -v,可以查看g++版本和MinGW版本,当host,build,target都指向mingw64(本人机器中--host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32)表明可以使用mingw 64位的编译器了。
二.编译FFTW。
1.点击打开链接下载FFTW源码(http://www.fftw.org/download.html),解压。
2.打开msys进入FFTW解压后的文件夹中(使用linux命令),输入命令./configure -h查看其中编译配置的选项,选择需要配置的命令(例如编译支持多线程double型的 我输入的是./configure --prefix=/mingw64/local64/fftwout5/ --disable-alloca --enable-float --with-our-malloc16 --with-windows-f77-mangling --enable-shared --disable-static --enable-threads --with-combined-threads --with-incoming-stack-boundary=2(生成的文件将会保存到/mingw64/local64/fftwout5/文件夹中),然后输入make编译,最后输入make install安装。
3.在生成的文件中找到.dll文件(本人的在/mingw64/local64/fftwout5/bin/中),利用pexports命令(需要安装pexprots安装包)生成.def命令(pexports *.dll -o > *.def),最后利用Visual Studio 2008 x64 Win64 Command Prompt生成.lib文件。
三.测试FFTW运行时间。
1.新建64位工程,在项目属性中链接器选项中的input中添加上述生成的.lib文件中,通用选项中加入.lib所在文件夹路径。
2.编写测试代码
在fftw文档中摘录后添加一部分:
#include "stdafx.h"
#include <Windows.h>
#include <fftw3.h>
#include <stdio.h>
#define N 3200
#define NTIMES 96
void fftwtest( )
{
fftwf_complex *in[NTIMES];
fftwf_complex *out[NTIMES];
fftwf_plan p[NTIMES];
int nthreads = 1;//表示线程个数
int a=fftwf_init_threads();
fftwf_plan_with_nthreads(nthreads);
for(int i=0;i<NTIMES;++i)
{
in[i] = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * N);
out[i] = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * N);
for(int j=0;j<N;++j)
{
in[i][j][0]=j;
in[i][j][1]=j;
}
}
for(int i=0;i<NTIMES;++i)
{
p[i] = fftwf_plan_dft_1d(N, in[i], out[i], FFTW_FORWARD, FFTW_ESTIMATE);
}
DWORD dwStart=::GetTickCount();
for(int i=0;i<NTIMES;++i)
fftwf_execute(p[i]); /* repeat as needed */
for(int i=0;i<NTIMES;++i)
{
for(int j=0;j<N;++j)
{
out[i][j][0]=out[i][j][0]*in[i][j][0]+out[i][j][1]*in[i][j][1];
out[i][j][1]=out[i][j][0]*in[i][j][1]+out[i][j][1]*in[i][j][0];
}
}
DWORD dwSEnd=::GetTickCount();
float fTime=(dwSEnd-dwStart)/1000.0f;
printf("fTime=%f\n",fTime);
for(int i=0;i<NTIMES;++i)
{
fftwf_destroy_plan(p[i]);
fftwf_free(in[i]);
fftwf_free(out[i]);
}
}