2011-03-24 15 views
6

Estoy tratando de ejecutar el código FFTW en un archivo mex. Esto es estrictamente para el propósito de desarrollo y prueba. Después de buscar en Google, veo que otros han intentado hacer algo similar y han tenido problemas relacionados, pero no he encontrado ninguna solución. Al intentar ejecutar el archivo mex, Matlab me dice:Vinculación de FFTW en el archivo Matlab Mex

??? Error al usar ==> chirpTransform.mxCta Archivo MEX no válido '\ removed \ my \ directory \ + chirpTransform \ mxCta.mexw32': No se pudo encontrar el procedimiento especificado .

.

Estoy usando gnumex con MinGW para compilar el archivo mex porque LCC parece tener algunos problemas. He intentado usar el DLL de 32 bits del sitio de FFTW (http://www.fftw.org/install/windows.html). He intentado usar fftwf3.dll en el directorio bin de Matlab 2009b. Construí el dll desde la fuente usando Msys/MinGW. En todos los casos, los resultados son los mismos. En todos los casos, hice lo siguiente para generar el archivo lib.

c: \ gnumex \ mexdlltool.exe -d libfftw3f-3.DEF -D libfftw3f-3.DLL -l libfftw3f.lib --como C: \ MinGW \ bin \ as.exe

También intenté usar la herramienta visual studio lib.exe y experimenté con varias banderas mexdlltool.

Parece que puedo llamar directamente a funciones en fftwf3-3.dll utilizando la funcionalidad loadlibrary de Matlab. Dado que el DLL no parece ser el problema, intenté construir una versión estática de fftwf3 y vincularla directamente al archivo mex. ¡Obtuve los mismos resultados! Si elimino el código FFTW, el archivo mex funciona bien. Casi me he dado por vencido en este punto, y estoy a punto de idear métodos alternativos de prueba.

+1

"LCC parece tener algunos problemas" - ¿a qué se refiere exactamente? –

+0

puede publicar el código del MEX que está usando (partes relevantes al menos)? – Amro

+9

Matlab realmente usa FFTW internamente para su FFT. Asegúrese de que su versión de FFTW no entre en conflicto con la que usa Matlab, o enlace en contra de la biblioteca de Matlab FFTW. – sfstewman

Respuesta

1

He encontrado este problema con otras funciones mex. En mi experiencia, normalmente significa que hay un problema de dependencia. Alguna dependencia no se encuentra.

Aquí hay un enlace a la documentación de TMW sobre este tema: Invalid MEX-File Error

Dale una lectura, y luego trate de usar la dependencia andador para diagnosticar el problema.

0

Ha pasado mucho tiempo, y mi configuración ha cambiado, pero esto funciona para mí ahora. Sospecho que Hoogamaphone tenía razón. Probablemente no tenía el dll fftw en el mismo directorio que el dll mex (y no estaba en mi camino). De hecho, Matlab 2016a de 64 bits todavía te advierte sobre la imposibilidad de encontrar el archivo mex cuando, de hecho, es una dependencia que falta.

Mi configuración actual está utilizando el compilador Visual Studio 2013 C++ de forma predeterminada. Como se menciona en el sitio web fftw, debe generar un archivo lib para vincular. Puede ejecutar el símbolo del sistema de Visual Studio desde un símbolo del sistema regular de este modo:

"%VS120COMNTOOLS%VsDevCmd.bat" 

A continuación, ejecute lo siguiente en el directorio con el archivo de definición.

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

Y compila.

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

Quizás otra posibilidad es que gnumex introdujo alguna dependencia en el dll mex. Ya no recuerdo si había usado gnumex con éxito probando otro código. Al usar cygwin, si no usa el compilador mingw (x86_64-w64-mingw32-gcc), terminará con una dependencia en cygwin1.dll.

Finalmente, si usa más de un compilador, asegúrese de que todos los indicadores del compilador sean los mismos (las mismas convenciones de llamada a funciones, ABI, etc.). Además, Mathworks ha cambiado el procedimiento de compilación mex. En un proyecto reciente, he copiado mexconfig.xml a mi directorio local de

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

y editados los parámetros del compilador como por lo :

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

Si utiliza un archivo de compilación personalizado, use la opción -f.

mex mxCustom.c custom.lib -f mexconfig.xml 
Cuestiones relacionadas