2011-03-24 13 views
6

Sto cercando di eseguire il codice FFTW in un file mex. Questo è strettamente per lo scopo di sviluppo e test. Dopo alcune ricerche su google, vedo che altri hanno provato a fare qualcosa di simile e hanno avuto problemi correlati, ma non ho trovato alcuna soluzione. Durante il tentativo di eseguire il file mex, Matlab mi dice:Collegamento di FFTW nel file Matlab Mex

??? Errore nell'uso ==> chirpTransform.mxCta File MEX non valido '\ removed \ my \ directory \ + chirpTransform \ mxCta.mexw32': La procedura specificata non può essere trovata .

.

Sto usando gnumex con MinGW per creare il file mex perché LCC sembra avere alcuni problemi. Ho provato a utilizzare la DLL a 32 bit dal sito FFTW (http://www.fftw.org/install/windows.html). Ho provato a utilizzare fftwf3.dll nella directory bin di Matlab 2009b. Ho costruito la DLL dal sorgente usando Msys/MinGW. In tutti i casi, i risultati sono gli stessi. In tutti i casi ho fatto quanto segue per generare il file lib.

c: \ gnumex \ mexdlltool.exe -d libfftw3f-3.def -D libfftw3f-3.dll -l libfftw3f.lib -come C: \ MinGW \ bin \ as.exe

Ho anche provato a utilizzare lo strumento visual studio lib.exe e ho sperimentato vari flag di mexdlltool.

Sembra che sia possibile chiamare direttamente funzioni nel file fftwf3-3.dll utilizzando la funzionalità di LoadLibrary di Matlab. Dal momento che la DLL sembra non essere il problema, ho provato a creare una versione statica di fftwf3 e collegandola direttamente al file mex. Ho avuto gli stessi risultati! Se rimuovo il codice FFTW, il file mex funziona correttamente. Ho appena rinunciato a questo punto, e sono stufo di trovare metodi alternativi di test.

+1

"LCC sembra avere alcuni problemi" - cosa intendi esattamente? –

+0

puoi pubblicare il codice del MEX che stai usando (parti rilevanti almeno)? – Amro

+9

Matlab utilizza in realtà FFTW internamente per la sua FFT. Assicurati che la tua versione di FFTW non sia in conflitto con quella usata da Matlab o che sia collegata alla libreria Flaus di Matlab. – sfstewman

risposta

1

Ho incontrato questo problema con altre funzioni di messaggistica unificata. Nella mia esperienza, in genere significa che c'è un problema di dipendenza. Alcune dipendenze non si trovano.

Ecco un link alla documentazione di TMW su questo tema: Invalid MEX-File Error

dargli una lettura, e quindi provare a utilizzare Dependency Walker per diagnosticare il problema.

0

È passato molto tempo e la mia configurazione è cambiata, ma ora funziona per me. Ho il sospetto che hoogamaphone avesse ragione. Probabilmente non avevo la dft fftw nella stessa directory della mex dll (e non era nel mio percorso). Infatti, Matlab 2016a a 64 bit ti dà ancora un avvertimento sul non essere in grado di trovare il file mex quando, in realtà, è una dipendenza che manca.

L'impostazione corrente utilizza il compilatore Visual Studio 2013 C++ per impostazione predefinita. Come menzionato sul sito Web di fftw, è necessario generare un file lib per il collegamento. È possibile eseguire il prompt dei comandi di Visual Studio dal prompt dei comandi normale in questo modo:

"%VS120COMNTOOLS%VsDevCmd.bat" 

quindi eseguire il seguente nella directory con il file DEF.

lib /machine:x64 /def:libfftw3f-3.def 

E compilare.

mex mxCta.c cta.c -I../fftw -L../fftw -llibfftw3f-3.lib 

Forse un'altra possibilità è che gnumex ha introdotto una certa dipendenza nella dll di mess. Non ricordo più se ho usato gnumex con successo testando altro codice. Quando usi cygwin, se non usi il compilatore mingw (x86_64-w64-mingw32-gcc), finirai con una dipendenza da cygwin1.dll.

Infine, se si utilizza più di un compilatore, assicurarsi che tutti i flag del compilatore siano uguali (stessa convenzione di chiamate, ABI, ecc.). Inoltre, Mathworks ha cambiato la procedura di creazione del Messico. In un recente progetto, ho copiato mexconfig.xml alla mia directory locale da

C: \ Users \ myuser \ AppData \ Roaming \ MathWorks \ MATLAB \ R2016a \ mex_C_win64.xml

e curato il flag di compilazione in questo modo :

COMPFLAGS="/Zp8 /GR /W3 /EHs /nologo /MD /Gz /TC" 

Se si utilizza un file di build personalizzato, utilizzare l'opzione -f.

mex mxCustom.c custom.lib -f mexconfig.xml 
Problemi correlati