Использование GCC (MinGW) в качестве компилятора MEX MATLAB

Мне дали проект для запуска на MATLAB R2011a. Так как их несколько .c-файлы там - мне нужно настроить GCC в качестве компилятора MEX для этого проекта. Однако я не могу найти никакого объяснения тому, как его настроить. Я пробовал программу-скрипт под названием gnumex-но она не удалась (вероятно, настроена для более старой версии MATLAB).

есть идеи, как его настроить?

13 ответов


в Matlab 2011b просто компилируйте и связывайте непосредственно в среде mingw64 или cygwin.

MINGWPATH=c:/MinGW64
CYGPATH=c:/cygwin

MATLABROOT=c:/Progra~1/MATLAB/R2011b
CC=$(MINGWPATH)/bin/x86_64-w64-mingw32-gcc 
CFLAG= -Wall -m64 -O3 -I$(MATLABROOT)/extern/include $(SRC) $(LIBS) -o $(EXE)
MEXFLAG=-m64 -shared -DMATLAB_MEX_FILE -I$(MATLABROOT)/extern/include -Wl,--export-all-symbols $(LIBS) $(MEXSRC) -o $(MEXTGT).mexw64

LIBS= -L$(MATLABROOT)/bin/win64 -L$(MATLABROOT)/extern/lib/win64/microsoft -lmex -lmx -lmwlapack -lmwblas -leng
EXE=../bin/engwindemo.exe
MEXTGT=
SRC=engwindemo.c
MEXSRC=
all:$(EXE)

$(EXE):  $(SRC)
    $(CC) $(CFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex -o $(EXE)
    @rm -f *.o*

$(MEXTGT):  $(MEXSRC)
    $(CC) $(MEXFLAG) -ladvapi32 -luser32 -lgdi32 -lkernel32 -lmingwex 
    @rm -f *.o*

поместите этот файл makefile в каталог исходного кода и make. Преобразование файлов dll не требуется.


почему бы не настроить mexopts.файл bat в вашем каталоге? Таким образом, вы можете использовать команду" mex " прозрачно для компиляции чего-либо, как обычно в MATLAB, так же, как если бы она была настроена MATLAB с помощью mex -setup. Я удивлен, что никто не делал этого раньше.

файл ниже предназначен для x64 версии Matlab и Mingw. Я использую TDM Mingw64 дистрибутив, который я установил в p:\mingw64-tdm. У меня установлен Matlab в p:\matlab\R2012a -- редактировать эти соответственно.

это mexopts.bat-файл, который я использую, скопируйте его в %USERPROFILE%\AppData\Roaming\MathWorks\MATLAB\R2012a\mexopts.bat:

@echo off

set MINGWPATH=p:\mingw64-tdm
set PATH=%MINGWPATH%\bin;%PATH%

set COMPILER=gcc
set COMPFLAGS=-c -m64 -I"%MATLAB%\extern\include" -DMATLAB_MEX_FILE -Wall -std=c99
set OPTIMFLAGS=-O3 -DNDEBUG
set DEBUGFLAGS=-g
set NAME_OBJECT=-o

set LINKER=gcc
set LINKFLAGS=-shared -L"%MATLAB%\bin\win64" -L"%MATLAB%\extern\lib\win64\microsoft" -lmex -lmx -leng -lmat -lmwlapack -lmwblas
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"

тогда вы можете просто попробовать сделать это в Matlab:

mex -v p:\matlab\R2012a\extern\examples\mex\yprime.c
which yprime

должна принести b:\code\m\yprime.mexw64 (или независимо от текущей папки). Тогда, если вы:

yprime(1,1:4)

вы увидите:

ans =
    2.0000    8.9685    4.0000   -1.0947

что означает, что вы в бизнесе. Удачи!

редактировать Oct 2014: теперь я использую улучшенный mexopts.bat файл, чем выше с другим MinGW64 (дает немного более быстрый двоичный код, чем TDM). См.моя домашняя страница для получения подробной информации и загрузки.


начиная с MATLAB R2015b, MinGW официально поддерживается!

сейчас на вершине список поддерживаемых компиляторов.

посмотреть здесь для официальных инструкций для загрузки MinGW (они рекомендуют TDB-GCC).

здесь несколько ограничений и предостережений, перечисленных (например, не связывайтесь с библиотеками, скомпилированными с другими компиляторами, вы должны поймать свои исключения внутри файла MEX, так далее.).

ниже мой старый способ сделать XML-файл, чтобы сделать то же самое.


годы прошли и Матлаб (как R2014a) переехал в новый XML-based системы для настройки файлов MEX. MATLAB по-прежнему поддерживает наследие .bat файлах, на данный момент, но это будет беспокоить вас об этом. Другое изменение-это различные конфигурации C и c++ (более поздние).

что осталось прежним, так это то, что вы просто нужно загрузить и извлечь дистрибутив MinGW и указать на него MATLAB. Есть еще нет необходимости в MSYS, cygwin или gnumex. Единственная сложная часть указывает на MATLAB, но вот решение.

Короткая Версия

  • Загрузите и извлеките дистрибутив MinGW. Выберите один, например MinGW-w64 (64-разрядная версия) или TDM-GCC (32-разрядные и 64-разрядные варианты).
  • настройка XML файл config, используя этот как шаблон (подробности в длинной версии ниже).
  • Set MINGWROOT переменные среды.
  • выполнить mex -setup:[xmlfile] [C|C++].

Текст

для MinGW-w64 я делаю следующее, Чтобы настроить его:

  1. возьмите последняя версия для w64 от Sourceforge (или использовать установщик выбрать toolchain вы хотите, выбирая pthread или Win32 threads версия в зависимости от ваших потребностей).
  2. извлеките его, чтобы у вас был путь к компилятору, например C:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1\bin\x86_64-w64-mingw32-g++.exe. нет необходимости в MSYS, cygwin или любой другой среде, если вы планируете компилировать в MATLAB с помощью mex команда. Проверьте свой PATH переменные среды, чтобы убедиться, что у вас нет нескольких компиляторов (g++) на вашем пути, желательно ни один. Проверьте с помощью новой командной строки.
  3. создать пользовательский XML конфигурационный файл. На моем репозитории GitHub я опубликовал конфигурации C++ для MinGW-w64 в обоих типах файлов: mex_C++_mingw-w64.в XML и наследие mingw_mexopts.летучая мышь!--21-->. Начните с этого в качестве шаблона и (необязательно) отредактируйте XML-файл с описательным именем и версией загруженного и извлеченного вами дистрибутива MinGW.
  4. настройка (или создать)MINGWROOT переменные среды. Это то, что позволяет mex команда для поиска компилятор. Вы можете сделать это в MATLAB (и каждый раз MATLAB начинается с startup.m скрипт userpath) С setenv, или только один раз с диалоговое окно свойств Windows или родной Windows 7 setx.команда ехе.
  5. выполнить mex -setup:C:\actual\configFilePath.xml C++. Например, с помощью .xml-файл для настройки компиляции файлов c++ MEX:

    setenv('MINGWROOT','H:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1')
    mex -setup:H:\building\GitHub\MATLAB\MinGW\mex_C++_mingw-w64.xml C++
    

    вывод должен выглядеть так:

    MEX настроен на использование 'MinGW-w64 GCC 4.9.2 posixthreads seh' для компиляции языка C++.

при необходимости настройте компилятор C аналогичным образом с новым конфигурационным файлом XML, указывающим язык C, интерфейс компилятора C (например, "x86_64-w64-mingw32-gcc.exe", который не будет автоматически связывать стандартную библиотеку C++), настроить библиотеки ссылок по мере необходимости, флаги компилятора (например, изменить -std=c++11 to -std=c99), так далее.


обратите внимание на статическое и динамическое связывание библиотек времени выполнения

библиотеки, такие как файл MEX, созданный с помощью MinGW-w64, как указано выше, могут зависеть от нескольких библиотек DLL (во время выполнения): LIBGCC_S_SEH-1.DLL (для дистрибутивов исключений seh) и LIBSTDC++-6.DLL и, возможно, libwinpthread-1.dll, если вы выбрали дистрибутив pthreads вместо Win32 threads. Если вы не хотите копировать эти файлы, вы можете статически связать библиотеки времени выполнения в ваш файл MEX, добавив следующие параметры:

-static-libgcc -static-libstdc++

в шаблоне XML есть комментарий об этом. См.здесь для получения информации о libpthread-1.файл DLL.

С TDM-GCC,наоборот: среды выполнения (включая pthread) статически связаны автоматически. Для динамической связи, которая потребует DLL, но уменьшит размер файла MEX, вам нужно:

-shared-libgcc -shared-libstdc++

EDIT: кажется, есть гораздо лучший способ с MinGW; см. Мой другой ответ.

вы можете составить .mex файл с помощью gcc если у вас Matlab установлено, из командной строки. Кто-то может сказать, что в первый раз это немного утомительно.

сначала первое - какой Matlab вы используете? если 64-бит, MinGW не поможет вам, потому что он 32-битный. Поэтому я покажу, как использовать MinGW-w64. Понимание того, как это сделать это с 32-bit MinGW должно быть просто.

  1. добавить C:\MinGW-64\bin\ в свой путь. Вы не пожалеете об этом:)
  2. компилировать .c файлы с помощью gcc:

    x86_64-w64-mingw32-c++ -m64 -shared -I"C:\Program Files\MATLAB\R2010b\extern\include" -o bla.mexw64 -DMATLAB_MEX_FILE -Wl,--export-all-symbols *.cpp
    
  3. это приведет к куче ошибок компоновщика, таких как

    undefined reference to `mexErrMsgTxt'
    

    чтобы решить эту проблему, вам придется создать библиотеку импорта, которая соединяет с libmex.dll, libmx.dll, libmat.dll и libeng.dll (у вас могут быть другие, но это основные из них)

  4. перечислите функции, которые вам не хватает, и, ну, угадайте, что dll они идут от. Подсказка:mexErrMsgTxt С libmex.dll, потому что он начинается с "mex"...

  5. для каждого dll вам нужно экспортировать, создать содержащих

    EXPORTS
    ... relevant function names go here, such as mexErrMsgTxt, matOpen, etc.
    
  6. выполните следующую команду, чтобы создать импортировать библиотеки:

    x86_64-w64-mingw32-dlltool -d libmx.def --dllname libmx.dll -l libmx.a
    

    (то же самое для остальной части .def файлы)

  7. теперь вы хорошо идти!

    x86_64-w64-mingw32-c++ -m64 -shared -I"C:\..." -DMATLAB_MEX_FILE -o bla.mexw64 -Wl,--export-all-symbols *.cpp libmex.a libmx.a libmat.a libeng.a
    

вещи, которые можно сделать лучше - вместо --export-all-symbol, только экспорт mexFunction (требуется создать другой .def файл, или добавив "__declspec(dllexport)" перед void mexFunction(...)).


MinGW способен прямая связь a DLL; то есть он создаст своего рода библиотеку импорта на лету при связывании.

Это означает, что компиляция может быть выполнена в один этап:

x86_64-w64-mingw32-c++ -m64 -shared -I"%MATLAB%/extern/include" -DMATLAB_MEX_FILE -o bla.mexw64 -Wl,--export-all-symbols *.cpp -L"%MATLAB%/bin/win64" -lmex -lmx -leng -lmat

Matlab ссылки на внешний код (C++, Fortran, Java и т.д.) С помощью mex файлов. (http://gnumex.sourceforge.net/)

настройки компилятора:

  1. установить TDM-GCC (Компилятор C++"C:\MinGW32\bin;") от http://tdm-gcc.tdragon.net/download
  2. установить Cygwin (toolkit предоставляет инструменты Unix на платформе Windows) из (http://ptolemy.eecs.berkeley.edu/ptolemyII/ptII4.0/cygwin.htm).
    скачать и установить cygwingDevel.exe
  3. получить gnumex архив через (https://sourceforge.net/projects/gnumex) и извлечь gnumex в ($MATLABHOME\gnumex).
    здесь $MATLABHOME было бы, например (C:\Program Files\MATLAB\R2010a)
  4. добавить этот каталог ($MATLABHOME\gnumex) к пути Matlab (File->Set Path в Matlab).
    Примечание: запустите Matlab с Администратором привилегии.
  5. в Matlab введите gnumex в командной строке. Заполните соответствующие пути, такие как;

    MinGW_Root = C:\MinGW32, Cygwin_Root=C:\cygwin

  6. Do'File->Save Config', затем нажмите 'Make Options file'. Выход из окна настройки gnumex.

тестирование:

скопировать mexopts.летучая мышь!--38--> (%AppData%\MathWorks\MATLAB\R2010a\mexopts.bat) в рабочий каталог (%UserProfile%\Documents\MATLAB) для этого теста.

  1. в matlab выполните следующее в командной строке;

    mex-f mexopts.летучая мышь "C:\Program файлы\MATLAB\R2010a\extern\examples\mex\yprime.c"

  2. вы получили (%UserProfile%\Documents\MATLAB\yprime.mexw32) при вводе;

    что yprime

  3. запустите его, набрав в MATLAB prompt >> yprime(1,1:4) и посмотреть, если вы получите 2.0000 8.9685 4.0000 -1.0947.

  4. теперь просто скопируйте mexopts.летучая мышь!--38--> to $MATLABHOME\bin и он должен работать в любом месте.

Matlab на платформе Linux:

  1. в командной строке Linux установите следующее:

    судо apt-получить установку компилятором gfortran ССЗ г++

  2. в Matlab выполните следующее в командной строке;

    mex-setup

  3. файлы опций, доступные для mex являются: **1**: /usr/local/MATLAB/R2012b/bin/mexopts.sh : выберите опцию 1. Чтобы проверить работу, выполните следующее в командной строке Matlab;

    mex " / usr/local/MATLAB/R2012b/extern/examples/mex / yprime.c"

    yprime(1,1:4)

в случае, если вы получите предупреждение;

Warning: You are using gcc version "4.6.3-1ubuntu5)".  The version
         currently supported with MEX is "4.4.6".
         For a list of currently supported compilers see: 
         http://www.mathworks.com/support/compilers/current_release/

в командной строке Linux:

  1. sudo apt-get install gcc-4.4 g++-4.4 gfortran-4.4
  2. sudo gedit /usr/local/MATLAB/R2012b/bin/mexopts.sh
  3. изменить 'gcc' до 'gcc-4.4' ,'g++' to 'g++-4.4' , 'gfortran' to 'gfortran-4.4' во всех случаях CC = 'gcc' , CXX = 'g++' и FC = 'gfortran'.
  4. сохраните файл и выйдите.

почему так много шагов? Если у вас есть Matlab 2016 или выше, просто сделать:

  1. скачать по MinGW и установить в папку без пробелов (т. е. не в "Program Files")
  2. добавить MW_MINGW64_LOC переменная среды, указывающая на папку установки (то же самое, что вы ввели в установщик)
  3. перезагрузите компьютер
  4. откройте MATLAB и введите mex -setup в консоли. Он должен сказать: "настроен на использование Компилятор MinGW"
  5. запустите / скомпилируйте программу MATLAB

я протестировал их на новом ПК с Windows 10, и он работает!


этот работает на Matlab 2012b под Windows 8:

https://github.com/DynareTeam/dynare/blob/master/windows/mexopts-win64.bat

измените каталог cgwin или замените его каталогом mingw, если он используется. Вы также можете echange компилятор-exe, если вы переключитесь на 64-разрядную версию.


в Windows 64 бит с R2011a он работал с http://tdm-gcc.tdragon.net/ и http://gnumex.sourceforge.net/ но я должен измениться maxopt.bat строку GM_ADD_LIBS следующим образом:

rem Add path to where dlls are:

set DLL_PATH="C:\Program Files\MATLAB\R2011a\bin\win64"

rem Add every dll needed:

set GM_ADD_LIBS=%DLL_PATH%\libmx.dll %DLL_PATH%\libmex.dll %DLL_PATH%\libmat.dll 

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


Я изначально думал, что это звучит как форма пытки, но, основываясь на приведенном выше ответе @user10171136, я на самом деле нашел довольно простым кросс-компиляцию для Windows mex из Fedora Linux. Fedora имеет пакеты mingw и mingw64, поэтому:

  1. sudo yum install mingw64-gcc mingw64-gcc-c++
  2. скопируйте из Windows Matlab установите оба extern/include и bin/win64 каталоги (на самом деле вам, вероятно, нужно только подмножество заголовков И небольшое подмножество DLL; libmat.dll libmex.dll libmx.dll может будь всем, что тебе нужно. Я поместил эти два каталога в новый R2010a-w64 каталог в моем существующем каталоге Linux MATLAB; измените приведенные ниже команды, соответствующие тому, где вы спрятали заголовки и библиотеки Windows.
  3. была одна проблема, с которой я столкнулся, а именно:char16_t необходима matrix.h и не определился. Я думаю matrix.h забыли включить uchar.h? Я работал с

это подробный walkthorugh ответ. Поэтому все заслуги должны идти на что ответ.

1 установить MinGW-w64:

1.1 загрузите эту сборку MinGW64-w64 и ее update:

(http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/mingw-w64-bin_x86_64-mingw_20111101_sezero.zip/download)

(http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/sezero_20111101-w64-update-rev.5747.zip/download)

(http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/README-mingw-w64-20111101_sezero.txt/download)

1.2 Установить (распаковать) загруженные архивы:

1.2.1 распакуйте файл сборки и переместите полученный на c:\

1.2.2 распаковать и скопировать (перезаписать) файл обновления на c:\mingw64

1.3 добавить C:\mingw64\bin к переменной Path:

set PATH=C:\mingw64\bin;%PATH%

2 в командной строке (вне среды Matlab) скомпилируйте свой *.c файлы: например,CCODEFILE.c (при условии, что Matlab 2012b установлен в ):

"c:\mingw64\bin\x86_64-w64-mingw32-g++.exe" -m64 -shared -I"C:/Program Files/MATLAB/R2012b/extern/include" -DMATLAB_MEX_FILE -o CCODEFILE.mexw64 -Wl,--export-all-symbols CCODEFILE.c -L"C:/Program Files/MATLAB/R2012b/bin/win64" -lmex -lmx -leng -lmat

3 тогда любой Matlab код должен работать нормально, когда он называет .


если вы не смогли установить Mingw-w64 С помощью панели инструментов дополнений Matlab2016b на Windows, вы можете использовать этот способ. Имейте это в виду, что вам нужно изменить пути в соответствии с вашими путями установки.

  1. на Mingw-w64 официальный сайт перенаправляет вас на Win-builds проект, который является менеджером пакетов для пакета инструментов разработки с открытым исходным кодом. Итак, сначала вам нужно установить Win-builds.
  2. при установке Win-builds убедитесь, что вы вводите путь, который не содержит пробелов например C:\Win-builds.
  3. после установки Win-builds просто нажмите Process кнопка для установки всех пакетов, где Mingw-w64 находится среди них.
  4. теперь, когда вы установили Mingw-w64, вам нужно определить MW_MINGW64_LOC переменной окружения, которая Matlab использует его для обнаружения Mingw-w64.
  5. определить переменная среды выполните следующие действия:

    панель управления\ System\ Advanced system settings\ Advanced\ переменная среды\ пользовательские переменные для $YOUR_USER_NAME\ New

  6. поставить Variable name = MW_MINGW64_LOC и Variable value = C:\Win-builds. Обратите внимание, что Win-builds помещает все исполняемые файлы в C:\Win-builds\bin и, определив эту переменную, Matlab автоматически сканирует bin папка пути ищет gcc.exe.
  7. теперь, когда вы установили Mingw - w64 и определяете the MW_MINGW64_LOC переменные среды, пришло время построить и протестировать пример yprime. Поэтому запустите Matlab и введите следующую команду (не забудьте соответствующим образом изменить путь):

    mex-v 'C:\Program файлы\MATLAB\R2016b\extern\examples\mex\yprime.c'

  8. Успешная установка покажет следующее сообщение:

    MEX успешно завершен.

  9. наконец, вы можете проверить ваша установка, набрав yprime(1,1:4). Ответ будет:

    ans = 2.0000 8.9685 4.0000 -1.0947


в linux, если вы вводите mex -setup, вы можете выбрать компилятор.

в windows, вы должны попытаться установить lcc, вы можете сделать это, например, установив Microsoft Visual Studio Express, который является бесплатным.