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



我正试图使用Visual Studio 2015编译一个使用FFTW的项目。不幸的是,由于以下问题,来自FFTW网站的预编译二进制文件与VS 2015不兼容:未解决的外部符号__imp__fprintf和__imp__iob_func,SDL2。尝试编译时会出现链接错误。

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

如果有人需要使用Visual Studio 2019为Windows程序构建静态或动态FFTW库:

你实际上不需要在接受的答案中做任何手动和复杂的步骤——它们很容易出错,比下面的步骤长一百倍。

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

  1. 如果您还没有安装Visual Studio 2019附带的所有组件,请启动它,按Ctrl-Q,然后键入">cmake linux工具";。它应该找到安装选项,您可以单击该选项并安装组件。如果您不在线,请启动VS的安装程序并选择此可选组件(">CMake tools for Linux")进行安装。

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

  3. 创建解决方案后,请像往常一样选择所需的目标平台(如x64版本)和内部版本类型(发布/调试)。退出VS.

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

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

  6. 等待进程结束(VS应该说">CMake生成完成。&")。然后,在解决方案资源管理器子窗口中,再次单击工具提示为">Switch View"的图标,并使用它切换到">CMake Targets View'"。

  7. 右键单击解决方案资源管理器子窗口中的项目名称,然后选择">CMake Settings"。

  8. 在CMake Settings子窗口中,将"Configuration type"设置为Debug或Release,并在"Toolset"字段中选择x64或x86等。

  9. 在CMake Settings子窗口中,点击链接">保存并生成CMake缓存以加载变量";。过程结束后,单击链接时间(有时需要这样做,尤其是在更改构建目标/类型时)。

  10. 如果要生成静态.lib文件,请在CMake Settings子窗口中禁用选项build_SHARED_LIBS。否则,您将构建一个共享的.dll。(不确定是否仍然需要这样做,但对于.dll构建,FFTW文档告诉我们"在编译前向fftw3.h和ifftw.h添加一行#define FFTW_dll")。

  11. 在VS中,选择构建>"全部重建">,并且您的.lib和.dll文件应位于子文件夹\out\build\x64 Debug\中(当然,对于x64 Debug内部版本,其他目标将位于其他位置)。如果失败了,有时只是基准应用程序的构建失败。幸运的是,您可以很容易地在CMake Settings子窗口中禁用它的构建——只需禁用选项BUILD_TESTS

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

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

重要:关闭VS解决方案然后再次打开时,必须重复步骤5和6。否则,如果使用">全部重建",则不会生成任何内容。

最后的技术说明:如果您的主应用程序静态链接到C运行时库(CRT),而不是动态链接到DLL,您还需要在">out"子文件夹中找到的所有名为"CMakeCache.txt"的文件中进行以下替换:将所有/MD替换为/MT,将所有/MD替换为由/MT。但是,只有在创建了所有构建配置(调试/发布、x86/x64)之后,才应该这样做。进行替换后,再次在VS中打开CMake设置,然后再次单击链接"保存并生成CMake缓存以加载变量"。

希望这能有所帮助。享受

我最终自己解决了这个问题。我不保证我做得最好,因为我不是Visual Studio专家,但它确实奏效了。为了子孙后代的利益,以下是我所做的。

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

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

打开"项目属性"窗口。你需要设置很多选项:

在"常规"中,将"配置类型"设置为静态库。(或者,如果你想要一个DLL,你可以把它设置为动态库,但你需要弄清楚如何让它导出必要的符号。我没有这么做,因为我想要一个静态库。)

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

(source dir)
(source dir)api
(source dir)dft
(source dir)rdft
(source dir)reodft
(source dir)kernel
(source dir)simd-support
(source dir)dftsimd
(source dir)dftscalar
(source dir)rdftsimd
(source dir)rdftscalar

如果您包含线程支持,那么在C/C++>语言中,将"Open MP support"设置为yes。

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

在C/C++>输出文件中,将"对象文件名"设置为$(IntDir)/%(RelativeDir)/。(FFTW有很多名称相同但目录不同的文件,默认情况下VS将所有对象文件放在同一目录中,这是不起作用的。)

现在,您可以将源文件添加到项目中,方法是右键单击解决方案资源管理器并选择"包含在项目中"。您应该将所有.c文件添加到以下文件夹中:

api
dft
dft/scalar
kernel
rdft
rdft/scalar
reodft

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

如果你想支持任何矢量指令集,你应该只包括与你想要的特定指令集相关的文件,从以下文件夹:

dft/simd
rdft/simd
simd-support

大概如果你想要mpi支持,你可以在"mpi"中包含这些文件。我没有这么做,所以我不知道你是否还需要其他东西来实现这一点。

请确保将配置设置为"Release"one_answers"x86"或"x64",具体取决于所需的二进制文件类型。

现在,如果我没有忘记任何关键的东西,你应该能够编译一个库。

最新更新