2011-03-24 114 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