将FFTW链接到Matlab Mex文件

6
我正在尝试在mex文件中运行FFTW代码,这仅用于开发和测试目的。经过一些搜索,我发现其他人也尝试过类似的事情,并且遇到了相关的问题,但我没有找到任何解决方案。当我尝试运行mex文件时,Matlab告诉我:
“???”错误使用==> chirpTransform.mxCta无效的MEX文件'\removed\my\directory\+chirpTransform\mxCta.mexw32': 找不到指定的过程。
我使用MinGW的gnumex来构建mex文件,因为LCC似乎存在一些问题。我尝试使用FFTW网站上的32位DLL(http://www.fftw.org/install/windows.html)。我尝试使用Matlab 2009b bin目录中的fftwf3.dll。我使用Msys / MinGW从源代码构建了dll。在所有情况下,结果都是相同的。在所有情况下,我执行以下操作生成lib文件。

c:\gnumex\mexdlltool.exe -d libfftw3f-3.def -D libfftw3f-3.dll -l libfftw3f.lib --as C:\MinGW\bin\as.exe

我还尝试使用Visual Studio的lib.exe工具并尝试了各种mexdlltool标志。

似乎我可以直接使用Matlab的loadlibrary功能调用fftwf3-3.dll中的函数。由于DLL似乎不是问题,我尝试构建fftwf3的静态版本并将其直接链接到mex文件中。结果是相同的!如果我删除FFTW代码,则mex文件运行正常。此时我几乎已经放弃了,并且正在尝试寻找替代测试方法。


1
"LCC 似乎有一些问题" - 你具体是什么意思? - Jonas Heidelberg
你能发布你正在使用的MEX代码吗?(至少是相关部分) - Amro
9
Matlab实际上在其FFT中内部使用FFTW。确保您所使用的FFTW版本不会与Matlab使用的版本冲突,或者链接到Matlab FFTW库。 - sfstewman
2个回答

1
我在使用其他的mex函数时也遇到过这个问题。根据我的经验,通常意味着存在依赖关系问题。某些依赖项未被找到。
这里是TMW有关此问题的文档链接: 无效的MEX文件错误 阅读一下,然后尝试使用依赖项检查器来诊断问题。

0

已经过了很长时间,我的设置已经改变,但现在对我有效。我怀疑hoogamaphone是正确的。我可能没有将fftw dll放在与mex dll相同的目录中(它也不在我的路径中)。事实上,64位Matlab 2016a仍然会警告您找不到mex文件,但实际上缺少的是依赖项。

我的当前设置默认使用Visual Studio 2013 C++编译器。正如在fftw网站上提到的,您需要生成用于链接的lib文件。您可以像这样从常规命令提示符中运行Visual Studio命令提示符:

"%VS120COMNTOOLS%VsDevCmd.bat"

然后在包含 def 文件的目录中运行以下命令。

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

然后编译。

mex mxCta.c cta.c -I../fftw -L../fftw -llibfftw3f-3.lib

也许另一个可能性是gnumex引入了一些依赖到mex dll中。我不再记得是否在测试其他代码时成功使用过gnumex。当使用cygwin时,如果你不使用mingw编译器(x86_64-w64-mingw32-gcc),你会得到对cygwin1.dll的依赖。
最后,如果你使用多个编译器,请确保所有编译器标志都相同(相同的函数调用约定、ABI等)。此外,Mathworks已经改变了mex构建过程。在最近的项目中,我将mexconfig.xml从我的本地目录复制了出来。

C:\Users\myuser\AppData\Roaming\MathWorks\MATLAB\R2016a\mex_C_win64.xml

并修改了编译器标志,如下所示:

COMPFLAGS="/Zp8 /GR /W3 /EHs /nologo /MD /Gz /TC"

如果您使用自定义构建文件,请使用 -f 选项。
mex mxCustom.c custom.lib -f mexconfig.xml

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