11.以VS2017配置fftw 64位为例讲解如何调用第三方库
最近在使用github上很多项目,然后就会需要配很多依赖包,很多第三方库需要加载进来,以前也经常配一些环境,但是都是看着网上的大佬们的教程一步一步走下来的,只知其然而不知其所以然,这次就配置就遇见了很多问题,很多教程不详细,或者过老,实在太坑,所以这次就好好学习了一下背后的知识,为以后配置第三方库打好基础。也分享给大家,希望大家少踩坑。
首先,上网下载了fftw的64位压缩包,地址在下面:
http://www.fftw.org/install/windows.html
解压缩后里面长这样:
这次我们要用到的只有下列文件,我们要用def文件生成lib文件
libfftw3-3.def libfftw3f-3.def libfftw3l-3.def
libfftw3-3.dll libfftw3f-3.dll libfftw3l-3.dll
fftw3.h
关于.dll .lib文件的基本知识看我这篇文章《9.浅谈.dll .lib .def文件格式究竟是什么》
如何用def文件生成lib库文件,看我这篇文章《10. 利用vs2017中的lib.exe把def文件生成lib文件》
这样子就可以把
libfftw3-3.def libfftw3f-3.def libfftw3l-3.def
三个文件生成为
libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib
好,有了.lib和.dll和头文件,我们就有了所有跑程序需要的东西了,接下来就是配置好环境即可。
为了比较清晰明了,而且也为了后面的路径好填,我们在其他地方新建一个文件夹,我是新建在桌面啦,其实无所谓,然后在里面创建bin, lib, include三个子文件夹,分别存放dll文件,lib文件,和头文件,只需要将
libfftw3-3.def libfftw3f-3.def libfftw3l-3.def放进bin里面,
libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib放在lib文件夹里面,
fftw3.h放进include里面
接下来以vs2017为例:
新建一个控制台项目
在项目—>属性栏下对项目的设置做更改
第一,要更改项目平台,为活动(x64),因为我们调用的库都是64位的
- 头文件路径:VC++目录下的包含目录,把刚才创建的include文件夹路径,我这里是
C:\Users\MJW\Desktop\fftw\source\FFT\include
加入进去 - lib文件路径:VC++目录下的库目录,把lib文件夹的路径放这里:
- dll文件路径:
这一条比较重要,因为现在所有第三方库都不用安装了,所以在运行程序的时候如何找到这些dll是一个问题。
exe在运行的时候找dll的顺序如下,理论上把dll加到任何一个环节都可以:
应用程序所在目录;
系统目录。GetSystemDirectory返回的目录,通常是系统盘\Windows\System32;
16位系统目录。该项只是为了向前兼容的处理,可以不考虑;
Windows目录。GetWindowsDirectory返回的目录,通常是系统盘\Windows;
当前目录。GetCurrentDirectory返回的目录;
环境变量PATH中所有目录。
我们之前做了这么多事情,就是为了在新的环境中不需要做任何配置就能运行VS的工程,所以任何手动拷文件/修改环境变量的方式都不是最好的。
最后采取的方法是将bin的路径加到环境变量PATH中,我不太想加入到系统环境变量中,因为需要重启。所以我加到VS的配置中,修改VS的环境变量即可。(这里使用相对路径是最好的,但是我在这里为了方便使用的绝对路径,请注意,后面我会进行改进)
注意!!!这里不要选继承!!!否则会报错找不到dll文件 - 添加附加依赖项
上面只是把所有的需要用到的文件路径包含进来了,并没有指明要用到哪些lib文件,所以还需要在这里指明具体的文件名:
libfftw3-3.lib;libfftw3f-3.lib;libfftw3l-3.lib;
把它们输入进去
好的,我们设置就结束了,记得点击应用哦
最后,记得一定要把调试时候的环境一并做了修改哦,X64就是X64,否则就会报错
最后,用一段测试程序测试一下吧 :)微笑脸
#include "stdafx.h"
#include "fftw3.h"
#include <stdio.h>
#define N 8
int main()
{
int i;
fftw_complex *din, *out;
fftw_plan p;
din = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
if ((din == NULL) || (out == NULL))
{
printf("Error:insufficient available memory\n");
}
else
{
for (i = 0; i<N; i++)/*测试数据*/
{
din[i][0] = i + 1;
din[i][1] = 0;
}
}
p = fftw_plan_dft_1d(N, din, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed */
fftw_destroy_plan(p);
fftw_cleanup();
for (i = 0; i<N; i++)/*OUTPUT*/
{
printf("%f,%fi\n", din[i][0], din[i][1]);
}
printf("\n");
for (i = 0; i<N; i++)/*OUTPUT*/
{
printf("%f,%fi\n", out[i][0], out[i][1]);
}
if (din != NULL) fftw_free(din);
if (out != NULL) fftw_free(out);
getchar();
return 0;
}
输出长这样
相对路径文章:
https://blog.****.net/elloop/article/details/51010151
参考文章:
- https://blog.****.net/cyh706510441/article/details/46676123
- https://www.cnblogs.com/hiddenfox/p/4199392.html
- https://blog.****.net/woainishifu/article/details/53507723
- https://blog.****.net/u011954296/article/details/54617048
- https://blog.****.net/sszgg2006/article/details/25220575
- https://blog.****.net/u014488388/article/details/52818929
- https://www.cnblogs.com/zqh20145320/p/6772985.html
- https://www.cnblogs.com/chensu/p/5632486.html