2016-02-20 167 views
1

我正在尝试使用Visual Studio 2015来编译使用FFTW的项目。不幸的是,由于这个问题,FFTW网站预编译的二进制文件与VS 2015不兼容:unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2。当您尝试编译时会出现链接错误。在Visual Studio 2015中使用FFTW

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

回答

1

我终于设法弄清楚了这一点。我不保证我以最好的方式做到了这一点,因为我不是Visual Studio专家,但它确实有效。所以为了后人的利益,这就是我所做的。

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

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

调出项目属性窗口。有很多选项需要设置:

通常,将“配置类型”设置为静态库。 (或者你可以将它设置为动态库,如果你需要一个DLL,但是你需要弄清楚如何让它导出必要的符号。我没有那样做,因为我想要一个静态库。)

在VC++目录中,编辑“包含目录”。

(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++>语言,设置“打开MP支持”:(由包含源的实际目录替换“(源代码目录)”)将以下目录添加是的。

如果你包括AVX支持,那么在C/C++>代码生成,设置了“启用增强指令集”到AVX。这意味着您生成的库不适用于任何不支持AVX的计算机。您只需在使用AVX的各个源文件上设置此选项即可解决此限制。对此我不确定。

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

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

api 
dft 
dft/scalar 
kernel 
rdft 
rdft/scalar 
reodft 

如果你想线程支持,你应该加入“线程” 除了为threads.c所有的源文件。 (那个包含pthreads版本。)

如果您想为任何向量指令集的支持,你应该只包括与该特定指令的文件集,而从下列文件夹想:

dft/simd 
rdft/simd 
simd-support 

据推测,如果你想MPI支持,包括“mpi”中的文件。我没有那样做,所以我不知道是否还有其他工作需要完成。

一定要将配置设置为“发布”和“x86”或“x64”,具体取决于您想要的二进制类型。

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

+0

感谢您花时间概述您的解决方案。我也被困在与VS 2015的兼容性上,它似乎不是一个流行的问题。 – benrules2