使用 Visual Studio 2015 构建 FFTW 库 [添加:VS 2019 的步骤]

Build FFTW lib with Visual Studio 2015 [added: steps for VS 2019]

我正在尝试使用 Visual Studio 2015 来编译一个使用 FFTW 的项目。不幸的是,由于这个问题,来自 FFTW 网站的预编译二进制文件与 VS 2015 不兼容:。尝试编译时出现 link 错误。

我正在寻找有关如何编译兼容版本的任何建议。显而易见的答案是使用 VS 2015 重新编译 FFTW,但我根本找不到任何关于如何使用 Visual Studio 编译它的说明,并且有很多建议很难做到这一点。标准版本是用 MinGW 编译的,他们确实提供了如何操作的说明。但是 MinGW 可以生成与 VS 2015 兼容的库吗?我也没有找到任何相关信息。

我最终设法自己解决了这个问题。我不保证我以最好的方式做到了,因为我不是 Visual Studio 专家,但它确实有效。所以为了后代的利益,我就是这样做的。

首先,复制config.h.in。调用新副本 config.h。现在手动编辑它来为你要生成的库设置选项:它应该使用什么精度模式,编译哪个向量指令集(如果有的话),各种类型的大小(这将取决于你是否计划以 32 位或 64 位模式编译),是否包括线程支持等

现在创建一个空的 VS 项目。我建议将它放在源文件夹的顶层。然后在解决方案资源管理器中,单击顶部的 "Show All Files" 图标。这将使以下步骤更容易,因为您可以直接从解决方案资源管理器添加或排除文件。

调出项目属性 window。您需要设置很多选项:

一般情况下,设置"Configuration Type"为静态库。 (或者如果你想要一个 DLL,你可以将它设置为动态库,但是你需要弄清楚如何让它导出必要的符号。我没有这样做,因为我想要一个静态库。)

在 VC++ 目录中,编辑 "Include Directories"。添加以下目录(用包含源的实际目录替换“(源目录)”):

(source dir)
(source dir)\api
(source dir)\dft
(source dir)\rdft
(source dir)\reodft
(source dir)\kernel
(source dir)\simd-support
(source dir)\dft\simd
(source dir)\dft\scalar
(source dir)\rdft\simd
(source dir)\rdft\scalar

如果您包括线程支持,则在 C/C++ > 语言中,将 "Open MP Support" 设置为是。

如果您包括 AVX 支持,则在 C/C++ > 代码生成中,将 "Enable Enhanced Instruction Set" 设置为 AVX。这意味着您生成的库将无法在任何不支持 AVX 的计算机上运行。您可以通过仅在使用 AVX 的单个源文件上设置此选项来绕过该限制。我不确定。

在 C/C++ > 输出文件中,将 "Object File Name" 设置为 $(IntDir)/%(RelativeDir)/。 (FFTW有很多同名不同目录的文件,而VS默认把所有目标文件都放在同一个目录下,这样是行不通的。)

现在您已准备好将源文件添加到项目中,您可以通过右键单击解决方案资源管理器并选择 "Include In Project" 来完成。您应该在以下文件夹中添加所有 .c 文件:

api
dft
dft/scalar
kernel
rdft
rdft/scalar
reodft

如果您想要线程支持,您应该在 "threads" 中添加所有源文件,threads.c 除外 。 (那个包含 pthreads 版本。)

如果您想要支持任何向量指令集,您应该只包含与您想要的特定指令集相关的文件,这些文件来自以下文件夹:

dft/simd
rdft/simd
simd-support

大概如果您需要 mpi 支持,您可以将文件包含在 "mpi" 中。我没有这样做,所以我不知道您是否还需要其他任何东西才能完成这项工作。

请务必将配置设置为 "Release" 和 "x86" 或 "x64",具体取决于您想要的二进制文件类型。

现在,如果我没有忘记任何重要的事情,你应该能够编译一个库。

如果有人需要使用 Visual Studio 2019:

为 Windows 程序构建静态或动态 FFTW 库

您实际上不需要执行已接受答案中的任何手动和复杂步骤 -- 它们容易出错,并且比以下步骤长一百倍。

首先,我有一个好消息要告诉你 -- Visual Studio 2019(免费社区版和专业版)supports CMake!所以你只需要做这些步骤:

  1. 如果您还没有安装 所有 随 Visual Studio 2019 提供的组件,请启动它,按 Ctrl-Q,然后输入“ linux 的 cmake 工具”。它应该找到安装选项,您单击并安装该组件。如果您不在线,请启动 VS 的安装程序和 select 这个可选组件(“CMake 工具 Linux”)进行安装。

  2. 在 Visual Studio 2019 年创建一个空的解决方案,选择适合库、C++ 和 Windows 桌面开发的模板。

  3. 创建解决方案后,select 您所需的目标平台(例如 x64 版本)和构建类型 (Release/Debug) 照常进行。退出VS.

  4. 从以下位置下载最新的源存档:http://www.fftw.org 并将文件解压缩到您创建 VS 解决方案和项目的文件夹中。不要 运行 MinGW 下提供的任何配置脚本,也不要执行官方或 third-party 文档中指示您执行的任何其他步骤。

  5. 运行 Visual Studio,打开您创建的解决方案,然后在“解决方案资源管理器”子窗口中,单击工具提示为“切换视图[的图标' 并使用它切换到 ' 文件夹视图 ' 模式。一旦发生这种情况,VS 就会开始使用所有文件填充解决方案资源管理器,最重要的是,它会自动发现配置脚本和 CMake 生成文件并开始配置解决方案,包括至关重要的 config.h.

  6. 等到过程完成(VS 应该说类似“CMake generation finished.”)。然后,在 Solution Explorer 子窗口中,再次单击工具提示为“Switch View”的图标,并使用它切换到“CMake Targets View'.

  7. Right-click Solution Explorer 子窗口中的项目名称和 select 'CMake Settings'.

  8. 在 CMake 设置子窗口中,将 'Configuration type' 设置为 Debug 或 Release,并在 'Toolset' 字段中 select x64 或 x86 等

  9. 在CMake设置子窗口点击link》保存并生成CMake缓存加载变量”。该过程完成后,单击 link 一个 时间(有时这是需要的,尤其是在更改构建时 target/type).

  10. 如果要构建静态 .lib 文件,请在 CMake 设置子窗口中禁用选项 BUILD_SHARED_LIBS。否则,您将构建一个共享的 .dll。 (不确定这是否仍然需要,但是对于 .dll 构建,FFTW 文档告诉我们“在编译之前添加一行 #define FFTW_DLL 到 fftw3.h 和 ifftw.h”)。

  11. 在 VS 中,select Build > Rebuild All 你的 .lib 和 .dll 文件应该在子文件夹 \out\build\x64-Debug \(当然对于 x64 调试版本——其他目标将在其他地方)。如果失败,有时只是基准测试应用程序的构建失败。幸运的是,您可以轻松地在 CMake 设置子窗口中禁用它的构建——只需禁用选项 BUILD_TESTS.

  12. 将生成的 .lib 或 .dll 文件添加到您的主应用程序项目中(在 VS 项目设置中:Linker > General > 'Additional Library Directories' > .lib 文件的路径;也在 Linker > Input > 'Additional Dependencies' .lib 文件名).

  13. 当然,还要将所有 FFTW API 头文件添加到您的主应用程序项目中——即 'api 中的所有头文件' 子文件夹(例如 'api.h' 和任何其他带有 .h 后缀的)。

重要提示:当您关闭 VS 解决方案然后再次打开它时,您必须重复步骤 5 和 6。否则,如果您使用 '全部重建'。

还有一个 最后的技术说明:如果您的主要应用程序 link 是静态地而不是动态地作为 C Run-time 库 (CRT) DLL,您还需要在“out”子文件夹中找到的所有名为 'CMakeCache.txt' 的文件中进行以下替换:替换所有 /MDd/MTd 和所有 /MD/MT。但是只有在创建了所有构建配置之后才应该这样做debug/release、x86/x64)。完成替换后,再次在 VS 中打开 CMake 设置并再次单击 link '保存并生成 CMake 缓存以加载变量'。

希望这对您有所帮助。享受吧!