本文转自(复制,黏贴)“老橘皮的马甲的博客”,作者写的很简单清楚,但很有用。注意64位的系统也可能需药32位的FFTW.
博士学长发给我一个C++源文件及头文件fftw3.h,让我在代码上修改。奈何我只学过一些C,更没有用过VS2010。于是我打算先在VS2010上把现成的这个C++程序给运行起来。新建项目、添加源文件和头文件的现有项atompot.cpp、fftw3.h、编译、运行。编译成功,但是运行后马上报错,LNK2019无法识别的外部符号!!!
通过无数次的百度,我了解到,出现“LNK2019无法识别的外部符号”这样的报错,主要是因为我在程序中引用了fftw3.h的头文件,但是没有配置对应的FFTW库。
下面,我就把自己在运行C++程序过程中(主要是配置FFTW库的问题)遇到的各种问题及解决办法一一列出。
一、出错:LNK2019无法识别的外部符号
如上提到的那样,在我的情况下,出现“LNK2019无法识别的外部符号”这样的报错,主要是因为我在程序中引用了fftw3.h的头文件,但是没有配置对应的FFTW库,下面是我借鉴网上搜到的方法亲身试验成功的一种方法:
1、登陆http://www.fftw.org/install/windows.html,下载 32-bit version: fftw-3.3.4-dll32.zip (2.4MB)。
注意:我是win7-64位的,还是要下32-bit version!!!不要问我为什么,我之前自以为是下了64-bit,结果程序运行还是出错,走投无路下了32-bit,倒是好了。血的教训!
2、把fftw-3.3.4-dll32.zip解压到某一文件夹,例如D:\fftw
3、打开VS命令提示(开始->Microsoft Visual studio 2010->Visual studio Tools->Visual Studio 命令提示(2010)),然后把文件路径定位到D:\fftw。
4、输入命令:
lib /def:libfftw3-3.def
lib /def:libfftw3f-3.def
lib /def:libfftw3l-3.def
结果,D:\fftw中会生成对应的lib文件:
libfftw3-3.lib
libfftw3f-3.lib
libfftw3l-3.lib
5、在VS2010中,
项目->属性->C/C++->附加包含目录,加上D:\fftw
项目->属性->链接器->常规->附加库目录,加上D:\fftw
项目->属性->链接器->输入->附加依赖项,加上libfftw3-3.lib、libfftw3f-3.lib、libfftw3l-3.lib
6、把D:\fftw中的libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll
三个dll文件复制到我的项目文件夹里(有.vcxproj文件的那个文件夹)。
注意:这一步至关重要,我之前用测试程序尝试了一下成功了,但是换到现有的程序时,因为忘记复制dll文件,导致运行又出错了。
7、附上fftw测试程序(网上搜的)
include “fftw3.h”
int main()
{
fftw_complex *in, *out;
fftw_plan p;
int N= 8;
int i;
int j;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
for( i=0; i < N; i++)
{
in[i][0] = 1.0;
in[i][1] = 0.0;
printf("%6.2f ",in[i][0]);
}
printf("\n");
p=fftw_plan_dft_1d(N,in,out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p);
for(j = 0;j < N;j++)
{
printf("%6.2f ",out[j][0]);
}
printf("\n");
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
return 0;
}
二、出错:Cannot find or open the PDB file
在网上找到了方法,一次就搞定了:
1、在VS2010中,工具->选项->调试->符号,选择Microsoft符号服务器,选择一个缓存路径,然后确认。
2、编译运行任何一个小程序(可能会有点慢)。
3、在VS2010中,工具->选项->调试->符号,去掉Microsoft符号服务器,确认。
三、运行时,控制台一闪而逝,输出窗口显示“ *.exe 本机已退出,返回值0”
原谅我如此小白的问题,但我是真的不懂,网上查了才知道,原来我把“运行”点成了“编译”,用Ctrl+F5或是调试->开始执行,问题解决!
四、应用程序无法正常启动(0xc000007b)
网上和我有类似情况的,说得很好。主要是libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll三个dll文件,首先得是32位的,然后得把它们复制到你的项目文件夹下(有.vcxproj文件的那个文件夹)。
从最初什么都不懂又做不出来的绝望,到现在还是什么都不懂但是已经把程序运行出来的轻松,最想感谢百度,感谢论坛、博客,以及知道上的各路精英,而且强烈觉得一定要把自己这段艰难的过程记录下来,当然,更主要是把自己的经验分享出来,吼吼!