Компиляция C++ MEX в MATLAB

Я пытаюсь использовать функцию edfImport (доступна здесь: http://kobi.nat.uni-magdeburg.de/edfImport)

Чтобы использовать эту функцию, я должен сначала запустить edfCompile (входит в набор инструментов). При запуске edfCompile я получаю сообщение об ошибке:

??? Error using ==> mex
Unable to complete successfully

Я использую MATLAB 7.1 (R14) и установил последние версии MinGW, Cygwin и Gnumex для моего компилятора (согласно инструкциям на этой странице: http://ptolemy.eecs.berkeley.edu/ptolemyII/ptII4.0/cygwin.htm)

Я могу скомпилировать примеры mex-файлов, но я все еще не уверен, что это не проблема с тем, как настроен мой компилятор. Любые советы с благодарностью принимаются. Было бы неплохо узнать, есть ли у кого-то еще проблемы с запуском edfCompile... (http://kobi.nat.uni-magdeburg.de/edfImport)

Большое спасибо

Изменить: сообщение об ошибке полностью:

In file included from edfMexImport.cpp:6:0: 
EDFFile2.h:37:39: error: 'mwSize' has not been declared 
EDFFile2.h:127:45: error: 'mwIndex' has not been declared 
edfMexImport.cpp: In function 'void mexFunction(int, mxArray**, int, const mxArray**)': 
edfMexImport.cpp:12:3: error: 'mwSize' was not declared in this scope 
edfMexImport.cpp:12:10: error: expected ';' before 'OutputDims' 
edfMexImport.cpp:48:12: error: expected ';' before 'OptionsDimN' 
edfMexImport.cpp:49:9: error: 'OptionsDimN' was not declared in this scope 
edfMexImport.cpp:51:13: error: 'OptionsDim' was not declared in this scope 
edfMexImport.cpp:51:33: error: expected primary-expression before ')' token 
edfMexImport.cpp:51:34: error: expected ';' before 'mxGetDimensions' 
edfMexImport.cpp:73:12: error: expected ';' before 'FlagsDimN' 
edfMexImport.cpp:74:9: error: 'FlagsDimN' was not declared in this scope 
edfMexImport.cpp:76:13: error: 'FlagsDim' was not declared in this scope 
edfMexImport.cpp:76:31: error: expected primary-expression before ')' token 
edfMexImport.cpp:76:32: error: expected ';' before 'mxGetDimensions' 

C:\PROGRAM FILES\MATLAB71\BIN\MEX.PL: Error: Compile of 'edfMexImport.cpp' failed. 

??? Error using ==> mex
Unable to complete successfully

Error in ==> edfCompile at 15
eval(sprintf('mex -I''%s'' edfMexImport.cpp EDFFILE2.cpp ''%s/edfapi.lib''', edfapiIncludesFolder, edfapiLibraryFolder));

person CaptainProg    schedule 18.05.2012    source источник


Ответы (3)


Похоже, некоторые определения типов отсутствуют, особенно типы mwSize и mwIndex. Можете ли вы добавить следующее в EDFFile2.h и повторить попытку?

ниже

#include "edf.h"
#include <mex.h>

Добавь это:

#ifndef mwSize
    #define mwSize int
#endif

#ifndef mwIndex
    #define mwIndex int
#endif
person Gunther Struyf    schedule 21.05.2012
comment
Да. Спасибо. Награжу награду, когда смогу. - person CaptainProg; 21.05.2012

Файл MEX был изменен для поддержки 64-битного «API обработки больших массивов», как описано в этом документе:

http://www.mathworks.com/support/solutions/en/data/1-5C27B9/

Обратите внимание, что эта необязательная поддержка больших переменных была впервые добавлена ​​в R7.3 (2006b), а ваша версия еще старше. По сути, ваш MATLAB слишком стар для API, используемого файлом MEX. Тем не менее, если файл MEX достаточно прост, решение Гюнтера может быть простым ответом на «бэкпорт» файла MEX в ваш старый MATLAB. Такие функции, как mxGetDimensions(), теперь возвращают mwSize*, но раньше возвращали int*.

Так что обновите MATLAB, если можете, иначе попробуйте ответ Гюнтера и сообщите нам, как дела.

person Peter    schedule 21.05.2012
comment
Хм, выполнив решение Гюнтера, я получаю пару предупреждений, тем не менее оно успешно компилируется. Но... после этого я пытаюсь запустить MEX-файл, и мне говорят, что он недействителен (Неверный MEX-файл: указанный модуль не найден) - хотя он определенно существует. Итак, я попытался запустить копию MATLAB (2009b) коллеги, как было предложено, но это не решает вторую проблему. Интересно, он вообще никогда не компилировался правильно... Тем не менее, награда достается Гюнтеру, так как он решил проблему, которую я описал в своем вопросе. Хотя, возможно, для этого придется начать другой... - person CaptainProg; 21.05.2012
comment
вы не пытаетесь запустить его на исходной установке Matlab, не так ли? Это также может вызвать проблемы, поскольку он скомпилирован для другой системы. (см. mathworks.fr/matlabcentral/newsreader/view_thread/163403 и mathworks.nl/support/solutions/en/data/1- 2223 МВт/index.html) - person Gunther Struyf; 21.05.2012

Вы заглядывали внутрь edfCompile.m? К сожалению, на моем ПК не установлен Matlab, поэтому я могу только предложить вам попробовать скомпилировать два файла .cpp edfMexImport.cpp и EDFFILE2.cpp вручную с помощью edfapi.lib

person Terenty Rezman    schedule 18.05.2012
comment
Я тоже это пробовал. Сообщение об ошибке такое же, как и раньше. Я разместил его полностью выше сейчас. - person CaptainProg; 21.05.2012