2011-03-24 149 views
6

我想在mex文件中运行FFTW代码。这完全是为了开发和测试的目的。经过一些Google搜索之后,我发现其他人试图做类似的事情并且遇到了相关的问题,但我还没有找到任何解决方案。当试图运行mex文件时,Matlab告诉我:将FFTW链接到Matlab Mex文件

???错误使用==> chirpTransform.mxCta无效的MEX文件 '\ removed \ my \ directory \ + chirpTransform \ mxCta.mexw32': 找不到指定的程序 。

我正在使用gnumex和MinGW来构建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似乎有一些问题” - 你是什么意思? – 2011-06-12 11:42:45

+0

您可以发布您正在使用的MEX的代码(至少相关部分)吗? – Amro 2011-10-19 07:14:33

+9

Matlab实际上在内部使用FFTW进行FFT。确保您的FFTW版本与Matlab使用的版本不冲突,或者链接到Matlab FFTW库。 – sfstewman 2012-06-29 02:12:45

回答

1

我遇到了这个问题与其他mex函数。根据我的经验,这通常意味着存在依赖性问题。某些依赖关系未找到。

这里是TMW的文档的链接在这个问题上: Invalid MEX-File Error

不妨一读,然后尝试使用的Dependency Walker来诊断问题。

0

这已经很长时间了,我的设置已经改变了,但现在这对我来说很有用。我怀疑hoogamaphone是对的。我可能没有与mex dll相同的目录中的fftw 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 \应用程序数据\漫游\ 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