Компиляция mex файлов в matlab с помощью mingw под windows 64 бит
Часто mex файлы в matlab легко компилируются с помощью visual studio и все вроде бы хорошо, но тут вы решаете, что неплохо бы прикрутить что-то из мира свободного кода, и тут получается проще собрать систему с mingw, чем использовать nmake.
P.S. Когда будете компилировать может не хватать файлов библиотек «o» (crtbegin.o, crtend.o, dllcrt2.o ), их нужно скопировать из mingw (в подпапках надо поискать) в папку вашего проекта (иначе через директиву LIB (ключ -L) у меня не получилось).
Что понадобиться:
- Matlab 2010b (или другой по вкусу, желательно с realtime workshop).
- MinGW 64 bit (http://sourceforge.net/projects/mingw-w64), рекомендую personal builds от sezero (я брал mingw-w64-bin_x86_64-mingw_20101003_sezero.zip).
- Gnumex (http://sourceforge.net/projects/gnumex/) версии 2.04 или более поздней.
Готовим:
- Предполагается, что мы будем делать чисто 64 битные приложения, так что смело распаковываем mingw в c:\mingw (диск можно другой, только чтобы имя диска было постоянным).
- Распаковываем gnumex в с:\gnumex.
- Открываем файл gnumex.m и начинаем исправлять ошибки (более подробно см. на sourceforge требуется регистрация, чтобы посмотреть все).
Строку 770
libdir = [matlabroot '\extern\lib\win32\lcc\'];
меняем на
if (strcmp(computer('arch'),'win64')) libdir = [matlabroot '\extern\lib\win64\microsoft\']; else libdir = [matlabroot '\extern\lib\win32\lcc\']; end
После строки 783
symbols = tok{2}(code=='T');
добавляем
symbols=symbols(2:2:end);
Строку 1191
fp(['set PATH=%PATH%;C:\Cygwin\usr\local\gfortran\libexec\gcc\i686-pc-cygwin\4.3.0']);
заменяем на
if ~isempty(pps.cygwinpath) fp(['set PATH=%PATH%;C:\Cygwin\usr\local\gfortran\libexec\gcc\i686-pc-cygwin\4.3.0']); end
Заменяем строки с 1268
if (pps.mexf == 1) % mexf compile if mlv_ge('7.1'), oext = 'mexw32'; else oext = 'dll'; end else % engine compile oext = 'exe'; end
на
if (pps.mexf == 1) % mexf compile if mlv_ge('7.1'), oext = '%MEX_EXT%'; else oext = '.dll'; end else % engine compile oext = '.exe'; end
и строку 1295
fp(['set NAME_OUTPUT=-o %OUTDIR%%MEX_NAME%.' oext]);
на
fp(['set NAME_OUTPUT=-o %OUTDIR%%MEX_NAME%' oext]);
- Создаем файл shortpath74.m
function shortpath74 = shortpath74(longPath) if ~isempty(longPath) shortpath74 = RTW.transformPaths(longPath); else shortpath74=longPath; end
либо компилируем с помощью visual studio два файла в gnumex/src shortpath.c и uigetpath.c добавив к именам 74 (я так не делал). - Запускаем maltab и идем в папку где стоит gnumex и запускаем gnumex.m, если два файла не компилировали, то ручками вбиваем где у вас, что находиться( на кнопку browse не нажимать!), или жмем на browse и выбираем.
Когда спросит перезаписать соглашаемся, ждем пока gnumex отработает (1-2 минуты) и жмем exit.
P.S. Когда будете компилировать может не хватать файлов библиотек «o» (crtbegin.o, crtend.o, dllcrt2.o ), их нужно скопировать из mingw (в подпапках надо поискать) в папку вашего проекта (иначе через директиву LIB (ключ -L) у меня не получилось).
0 комментариев