Компиляция mex файлов в matlab с помощью mingw под windows 64 бит

Часто mex файлы в matlab легко компилируются с помощью visual studio и все вроде бы хорошо, но тут вы решаете, что неплохо бы прикрутить что-то из мира свободного кода, и тут получается проще собрать систему с mingw, чем использовать nmake.
Что понадобиться:
  1. Matlab 2010b (или другой по вкусу, желательно с realtime workshop).
  2. MinGW 64 bit (http://sourceforge.net/projects/mingw-w64), рекомендую personal builds от sezero (я брал mingw-w64-bin_x86_64-mingw_20101003_sezero.zip).
  3. Gnumex (http://sourceforge.net/projects/gnumex/) версии 2.04 или более поздней.
Готовим:
  1. Предполагается, что мы будем делать чисто 64 битные приложения, так что смело распаковываем mingw в c:\mingw (диск можно другой, только чтобы имя диска было постоянным).
  2. Распаковываем gnumex в с:\gnumex.
  3. Открываем файл 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]);
  4. Создаем файл 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 (я так не делал).
  5. Запускаем maltab и идем в папку где стоит gnumex и запускаем gnumex.m, если два файла не компилировали, то ручками вбиваем где у вас, что находиться( на кнопку browse не нажимать!), или жмем на browse и выбираем.
    Когда спросит перезаписать соглашаемся, ждем пока gnumex отработает (1-2 минуты) и жмем exit.

P.S. Когда будете компилировать может не хватать файлов библиотек «o» (crtbegin.o, crtend.o, dllcrt2.o ), их нужно скопировать из mingw (в подпапках надо поискать) в папку вашего проекта (иначе через директиву LIB (ключ -L) у меня не получилось).


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.