2011-03-24 13 views
6

mexファイルでFFTWコードを実行しようとしています。これは厳密に開発とテストのためのものです。いくつかのグーグルの後、私は他の人が同様のことをやろうとしていて関連する問題を抱えているのを見るが、私は解決策を見いださなかった。 mexファイルを実行しようとすると、Matlabは私にこう教えてくれます:FFTWをMatlab Mexファイルにリンクする

??? ==> を使用しているエラーchirpTransform.mxCta無効なMEXファイル '\ removed \ my \ directory \ + chirpTransform \ mxCta.mexw32': 指定された手順は に見つかりませんでした。

LCCに問題があるように見えるため、MinGWでgnumexを使用してmexファイルを構築しています。私はFFTWサイト(http://www.fftw.org/install/windows.html)から32ビットDLLを使用してみました。私はMatlab 2009b binディレクトリのfftwf3.dllを使ってみました。私はMysys/MinGWを使ってソースからDLLを構築しました。すべての場合において、結果は同じである。すべての場合、私はlibファイルを生成するために以下の作業を行いました。

as.exe \ MinGWの\ binに\:

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

私は視覚的なスタジオのlib.exeツールを使って試して、様々なmexdlltoolフラグを試しました。

Matlabのloadlibrary機能を使用してfftwf3-3.dllの関数を直接呼び出すことができます。 DLLが問題ではないように見えるので、私はfftwf3の静的バージョンを構築し、それを直接mexファイルにリンクすることを試みました。私は同じ結果を得ました! FFTWコードを削除すると、mexファイルはうまく動作します。私はちょうどこの時点であきらめてしまいました。私は、テストの代わりの方法を考案しています。

+1

「LCCに問題があるようです」 - 正確にはどういう意味ですか? –

+0

あなたは使用しているMEXのコードを投稿することができますか? – Amro

+9

Matlabは実際にFFTWをFFTに内部的に使用しています。ご使用のFFTWのバージョンがMatlabが使用するものと矛盾していないか、Matlab FFTWライブラリとリンクしていないことを確認してください。 – sfstewman

答えて

1

他のmex機能でこの問題に遭遇しました。私の経験では、通常、依存関係の問題があることを意味します。一部の依存関係は見つかりません。ここで

は、この問題に関するTMWのドキュメントへのリンクです: Invalid MEX-File Error

はそれを読み取りを付け、その後、問題を診断するために、依存関係ウォーカーを使用してみてください。

0

時間がかかり、セットアップが変更されていますが、これは今すぐ動作します。私はホゴマホンが正しいと思う。私はおそらく、mex dllと同じディレクトリにfftw dllを持っていなかったでしょう(そしてそれは私のパスにはありませんでした)。実際、64ビットMatlab 2016aでは、実際には依存関係がない場合でもmexファイルが見つからないという警告が表示されます。

私の現在の設定は、デフォルトでVisual Studio 2013 C++コンパイラを使用しています。 fftwのWebサイトで述べたように、リンクするための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ビルド手順を変更しました。最近のプロジェクトでは、私は

Cからの私のローカルディレクトリにmexconfig.xmlをコピー:\ Users \ユーザーmyuserの\のAppData \ローミング\ 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 
関連する問題