将FFTW链接到Matlab Mex文件

时间:2011-03-24 15:44:23

标签: windows matlab mex fftw

我正在尝试在mex文件中运行FFTW代码。这完全是为了开发和测试的目的。经过一些谷歌搜索,我看到其他人试图做类似的事情,并有相关的问题,但我没有找到任何解决方案。在尝试运行mex文件时,Matlab告诉我:

  

???使用==>时出错   chirpTransform.mxCta无效的MEX文件   '\删除\我的\目录\ + chirpTransform \ mxCta.mexw32':   指定的程序不可能   找到。

     

我正在使用gnumex和MinGW来构建mex文件,因为LCC似乎有一些问题。我尝试过使用FFTW站点(http://www.fftw.org/install/windows.html)的32位DLL。我尝试在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文件运行正常。我刚刚放弃了这一点,而且我想要提出其他测试方法。

2 个答案:

答案 0 :(得分:1)

我与其他mex功能一起遇到了这个问题。根据我的经验,它通常意味着存在依赖性问题。找不到某些依赖项。

以下是TMW关于此问题的文档的链接: Invalid MEX-File Error

给它一个读取,然后尝试使用依赖性walker来诊断问题。

答案 1 :(得分: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