Связывание FFTW в файл Matlab Mex - PullRequest
6 голосов
/ 24 марта 2011

Я пытаюсь запустить FFTW-код в mex-файле. Это строго для целей разработки и тестирования. После некоторого поиска в Google я вижу, что другие пытались сделать что-то подобное и имели связанные проблемы, но я не нашел никаких решений. При попытке запустить mex-файл Matlab сообщает мне:

??? Ошибка при использовании ==> chirpTransform.mxCta Неверный MEX-файл '\ Удалено \ мой каталог \ \ + chirpTransform \ mxCta.mexw32': Указанная процедура не может быть найдено.

.

Я использую gnumex с MinGW для создания mex-файла, потому что LCC, похоже, имеет некоторые проблемы. Я пытался использовать 32-битную DLL с сайта FFTW (http://www.fftw.org/install/windows.html). Я пытался использовать fftwf3.dll в каталоге bin Matlab 2009b. Я собрал dll из исходного кода с помощью Msys / MinGW. Во всех случаях результаты одинаковы. Во всех случаях я сделал следующее, чтобы сгенерировать файл 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.

Похоже, что я могу напрямую вызывать функции в fftwf3-3.dll, используя функциональность loadlibrary для Matlab. Так как DLL, похоже, не является проблемой, я попытался создать статическую версию fftwf3 и связать ее непосредственно в mex-файл. Я получил те же результаты! Если я удаляю код FFTW, mex файл работает нормально. Я уже почти сдался и пытаюсь найти альтернативные методы тестирования.

Ответы [ 2 ]

1 голос
/ 13 мая 2014

Я столкнулся с этой проблемой с другими мекс-функциями.По моему опыту, это обычно означает, что существует проблема зависимости.Некоторая зависимость не найдена.

Вот ссылка на документацию TMW по этой проблеме: Недопустимая ошибка MEX-файла

Дайте ему чтение, а затем попробуйте использовать зависимостьХодок для диагностики проблемы.

0 голосов
/ 23 ноября 2016

Прошло много времени, и мои настройки изменились, но теперь это работает для меня.Я подозреваю, что hoogamaphone был прав.У меня, вероятно, не было fllw dll в той же директории, что и mex 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 \ 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
...