6

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

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

.

我正在使用带有 MinGW 的 gnumex 来构建 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 文件运行良好。在这一点上我几乎放弃了,我很想提出替代的测试方法。

4

2 回答 2

1

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

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

读一读,然后尝试使用依赖遍历器来诊断问题。

于 2014-05-13T13:00:08.427 回答
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
于 2016-11-22T21:39:15.507 回答