Начиная с MATLAB R2015b, официально поддерживается MinGW!
Теперь он находится на вершине списка поддерживаемых компиляторов .
См. здесь для официальных инструкций для загрузки MinGW (они рекомендуют TDB-GCC).
Есть несколько ограничений и предостережений в списке (например, не связывать библиотеки, скомпилированные с другими компиляторами, вы должны перехватывать исключения в файле MEX и т. Д.).
Ниже приведен мой старый способ сделать файл XML для того же.
Прошли годы, и MATLAB (по состоянию на R2014a) перешел на новую систему на основе XML для настройки файлов MEX. MATLAB пока что временно поддерживает устаревшие файлы .bat, но это будет беспокоить вас об этом . Другое изменение состоит в том, что это разные конфигурации C и C ++ (более подробно).
То, что осталось прежним, это то, что вам просто нужно скачать и извлечь дистрибутив MinGW и указать на него MATLAB. все еще нет необходимости в MSYS, cygwin или gnumex. Единственная сложность - указывать на нее MATLAB, но вот решение.
Короткая версия
- Загрузите и распакуйте дистрибутив MinGW. Выберите один, например, MinGW-w64 (64-разрядный) или TDM-GCC (32-разрядный и 64-разрядный варианты).
- Настройте файл конфигурации XML, используя этот в качестве шаблона (подробности в длинной версии ниже).
- Установить
MINGWROOT
переменная окружения.
- Выполнить
mex -setup:[xmlfile] [C|C++]
.
Длинная версия
Для MinGW-w64 я настраиваю его следующим образом:
- Получите последнюю версию для w64 от Sourceforge (или используйте установщик , чтобы выбрать нужный набор инструментов, выбирая версию потоков pthread или Win32 в зависимости от ваших потребностей).
- Распакуйте его, чтобы у вас был путь к компилятору, например
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++
), предпочтительно ни одного. Проверьте с помощью новой командной строки.
- Настройте его с помощью пользовательского XML-файла конфигурации. В моем репозитории GitHub я разместил конфигурации C ++ для MinGW-w64 в обоих типах файлов: mex_C ++ _ mingw-w64.xml и устаревших mingw_mexopts.bat . Начните с этого как шаблона и (необязательно) отредактируйте файл XML с описательным именем и версией загруженного и извлеченного вами дистрибутива MinGW .
- Установите (или создайте) переменную окружения
MINGWROOT
. Это то, что позволяет команде mex
найти компилятор. Вы можете сделать это в MATLAB (и каждый раз, когда MATLAB запускается со сценария startup.m
в userpath
) с setenv
или только один раз со свойствами Windows диалоговое окно или собственная команда Windows 7 setx.exe .
Выполнить 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
на -std=c99
) и т. Д.
Замечание о статическом и динамическом связывании библиотек времени выполнения
Библиотеки, такие как MEX-файл, созданный с помощью MinGW-w64, как указано выше, могут зависеть от нескольких библиотек DLL (во время выполнения): LIBGCC_S_SEH-1.DLL (для распределений исключений seh) и LIBSTDC ++ - 6.DLL и, возможно, libwinpthread- 1.dll, если вы выбрали дистрибутив pthreads вместо потоков Win32. Если вы не хотите копировать эти файлы, вы можете статически связать библиотеки времени выполнения с вашим MEX-файлом, добавив следующие параметры:
-static-libgcc -static-libstdc++
В шаблоне XML есть комментарий по этому поводу. См. здесь для получения информации о libpthread-1.dll.
С TDM-GCC, верно обратное : среды выполнения (включая pthread) статически связаны автоматически. Для динамического связывания, которое потребует DLL, но уменьшит размер вашего файла MEX, вам необходимо:
-shared-libgcc -shared-libstdc++