我已经从网站http://www.fftw.org/install/windows.html下载了预编译的Windows DLL。我还创建了 *.lib 文件。不过,它们不包含多线程相关的函数
fftw_init_threads
、fftw_plan_with_nthreads
等等。
那么,如何在windows上使用多线程fftw呢?我需要自己编译代码吗?
编辑:我尝试使用 Visual Studio 2022 自己构建版本 3.3.10。我正在使用 cmakesettings.json 中设置的以下标志进行编译:
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "RelWithDebInfo",
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"inheritEnvironments": [ "msvc_x64_x64" ],
"variables": [
{
"name": "ENABLE_SSE",
"value": "False",
"type": "BOOL"
},
{
"name": "ENABLE_SSE2",
"value": "True",
"type": "BOOL"
},
{
"name": "ENABLE_AVX2",
"value": "True",
"type": "BOOL"
},
{
"name": "ENABLE_AVX",
"value": "False",
"type": "BOOL"
},
{
"name": "ENABLE_FLOAT",
"value": "True",
"type": "BOOL"
},
{
"name": "ENABLE_THREADS",
"value": "True",
"type": "BOOL"
},
{
"name": "CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS",
"value": "True",
"type": "BOOL"
}
]
}
使用此设置,我仍然收到以下链接器错误:
创建库 fftw3f_threads.lib 和对象 fftw3f_threads.exp
ftw-3.3.10\out uild\x64-发布 pi.c.obj :错误 LNK2001: 未解析的外部符号 fftwf_mksolver_ct_hook
ftw-3.3.10\out uild\x64-发布 pi.c.obj :错误 LNK2001: 未解析的外部符号 fftwf_mksolver_hc2hc_hook
ftw-3.3.10\out uild\x64-发布 ftw3f_threads.dll:致命错误 LNK1120:2 个未解决的外部问题
好吧,我想我已经明白了,差不多了。至少,我可以看到事情出轨的地方。
根据注释,FFTW 宏化了它的所有函数名称(和全局变量)。在
CONVENTION
中,我们读到:
NAME MANGLING:使用
作为外部名称,而不是X(foo)
。fftw_foo
扩展为X(foo)
或fftwf_foo
,具体取决于 精度。fftw_foo
所以现在我们知道
fftwf_mksolver_ct_hook
的另一个自我实际上是X(mksolver_ct_hook)
。
快速搜索
mksolver_ct_hook
显示它是在 ct.c
中定义的(它是全局的),因此该文件显然没有包含在构建中。
同样,
mksolver_hc2hc_hook
在hc2hc.c
中定义。
交给你了。可能还有几英里路要走,但你现在应该没问题了。