6

mex ファイルで FFTW コードを実行しようとしています。これは厳密に開発とテストを目的としています。グーグルで調べたところ、他の人が同様のことを試み、関連する問題を抱えていることがわかりましたが、解決策は見つかりませんでした。mex ファイルを実行しようとすると、Matlab から次のように通知されます。

??? エラー使用 ==> 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 を使用してみました。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

また、ビジュアル スタジオの lib.exe ツールを使用してみたり、さまざまな mexdlltool フラグを試したりしました。

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

4

2 に答える 2

1

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

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

読んでから、Dependency Walker を使用して問題を診断してみてください。

于 2014-05-13T13:00:08.427 に答える
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 ビルド手順を変更しました。最近のプロジェクトで、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 に答える