如何在Windows上运行FFTW++?(适用于小白)

13

我正在使用Windows 10和Visual Studio 2015。在C++中,我需要对图像进行傅里叶变换以应用滤波器。似乎FFTW++是理想的解决方案,但我无法将其编译,这让我非常烦恼。由于我相对新手,因此不知道这有多尴尬。

我在Visual Studio中使用了NuGet函数来获取FFTW库。由于我找不到它,所以从以下链接下载了FFTW+: https://sourceforge.net/projects/fftwpp/。 我将下载内容复制到项目文件夹中,并在解决方案资源管理器中包含了头文件。但它没有编译成功,抛出了许多奇怪的错误(例如:在seconds.h中,它说获取时区的某个函数已过时,在fftww++.h中,它说std::max是不合法的)。

因此,在看到这不会起作用后,我回到了FFTW网站,并尝试使用Windows安装指南。 http://www.fftw.org/install/windows.html 我下载了64位版本,但我完全不知道如何进行库导入操作,或者甚至不知道它是干什么用的。 i.imgur.com/Qs7mFQT.png 这是我得到的全部信息,我完全迷失了。

我该如何使其编译成功? 如果可以的话,请详细解释如何使用此工具,我可能很蠢,但我真的不知道发生了什么,而且在Google上也找不到任何类似教程的东西。


现在你也可以使用开源库管理器,比如vckpg。安装额外的程序会增加一些负担,但如果你计划使用其他库,这是非常有用的。 - DanielTuzes
2个回答

33

获取64位预编译的FFTW 3.3.5 Windows DLL

  1. fftw-3.3.5-dll64.zip下载。
  2. 解压文件。

创建导入库(.lib文件)

  1. FFTW官方文档在这里
  2. 要了解如何将DLL链接到Visual Studio C++程序的背景,这篇MSDN文章链接可执行文件到DLL, 特别是关于隐式链接的部分是有帮助的。
  3. 同样有用的是README-WINDOWS,在解压缩位置可以找到。
  4. 打开Visual Studio开发人员命令提示符

    • 导航至 开始菜单 -> 所有应用程序 -> Visual Studio 2015 -> 开发人员命令提示符
    • 在我的机器上,位置是C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat
  5. 导航至解压缩位置,然后输入

    lib /machine:x64 /def:libfftw3-3.def

Generate .lib file

(对于单精度或双精度,请使用libfftw3f-3.def或libfftw3l-3.def)

  • 这将生成libfftw3-3.lib
  • 请注意,这是针对x64的。

打开Visual Studio并创建C++控制台应用程序

  1. 创建C++控制台应用程序 新建Visual Studio C++控制台应用程序
  2. 接受所有默认设置 保持默认设置
  3. 将解决方案平台设置为x64 x64平台

告诉Visual Studio在哪里找到FFTW头文件。

(摘自this的SO答案。)

这有多种方法,这里介绍其中一种。
  1. 在解决方案资源管理器中,右键单击项目,选择属性。 Project properties
  2. 添加其他包含目录。这将是解压缩的位置。 Additional include directories

(或者,可以将.h文件复制到Visual Studio项目文件夹中。)

告诉Visual Studio在哪里找到FFTW导入库。

  1. 右键单击项目并选择属性。 Project properties
  2. 添加附加库目录。这将是解压缩位置。 Additional library directories
  3. 添加附加依赖项。输入先前创建的 .lib 文件 (libfftw3-3.lib)。 Additional dependency

创建一个示例程序

(来自 FFTW 教程.)

#include "stdafx.h"

#include <fftw3.h>

int main()
{
    fftw_complex *in, *out;
    fftw_plan p;

    int N = 32;

    in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
    out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

    fftw_execute(p); /* repeat as needed */

    fftw_destroy_plan(p);
    fftw_free(in); fftw_free(out);

    return 0;
}

编译

告诉Windows如何找到FFTW DLL 最简单的方法是将FFTW DLL(libfftw3-3.dll)从解压位置复制到Visual Studio输出文件夹中。

  1. 在Visual Studio中右键单击解决方案,然后选择在文件资源管理器中打开文件夹Solution in File Explorer
  2. 导航到.exe输出文件夹(例如 fftw_helloworld2\x64\Debug) Exe output folder
  3. 复制DLL libfftw3-3.dll

运行/调试

  1. 设置断点
  2. 按 F5 或 启动调试器

为什么你必须复制dll文件?为什么不能直接使用“.lib”进行静态链接呢? - Tobi Akinyemi
LIB文件包含足够的代码来加载DLL并调用其函数:https://stackoverflow.com/a/62909235 - mzuther

2
感谢您的帮助,解决了我遇到的问题。这是我的回答:
控制台应用程序默认使用x86架构。我必须使用FFTW团队的32位dll文件。确保在调用lib时指定/machine:x86参数。这是在VS2017社区版本中完成的。
Ed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接