Использование 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 я делаю следующее, Чтобы настроить его:
- возьмите последняя версия для w64 от Sourceforge (или использовать установщик выбрать toolchain вы хотите, выбирая pthread или Win32 threads версия в зависимости от ваших потребностей).
- извлеките его, чтобы у вас был путь к компилятору, например
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.летучая мышь!--21-->. Начните с этого в качестве шаблона и (необязательно) отредактируйте XML-файл с описательным именем и версией загруженного и извлеченного вами дистрибутива MinGW.
- настройка (или создать)
MINGWROOT
переменные среды. Это то, что позволяетmex
команда для поиска компилятор. Вы можете сделать это в MATLAB (и каждый раз MATLAB начинается сstartup.m
скриптuserpath
) Сsetenv
, или только один раз с диалоговое окно свойств Windows или родной Windows 7 setx.команда ехе. -
выполнить
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
должно быть просто.
- добавить
C:\MinGW-64\bin\
в свой путь. Вы не пожалеете об этом:) -
компилировать
.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
-
это приведет к куче ошибок компоновщика, таких как
undefined reference to `mexErrMsgTxt'
чтобы решить эту проблему, вам придется создать библиотеку импорта, которая соединяет с
libmex.dll
,libmx.dll
,libmat.dll
иlibeng.dll
(у вас могут быть другие, но это основные из них) перечислите функции, которые вам не хватает, и, ну, угадайте, что
dll
они идут от. Подсказка:mexErrMsgTxt
Сlibmex.dll
, потому что он начинается с "mex"...-
для каждого
dll
вам нужно экспортировать, создать содержащихEXPORTS ... relevant function names go here, such as mexErrMsgTxt, matOpen, etc.
-
выполните следующую команду, чтобы создать импортировать библиотеки:
x86_64-w64-mingw32-dlltool -d libmx.def --dllname libmx.dll -l libmx.a
(то же самое для остальной части
.def
файлы) -
теперь вы хорошо идти!
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/)
настройки компилятора:
- установить TDM-GCC (Компилятор C++
"C:\MinGW32\bin;"
) от http://tdm-gcc.tdragon.net/download - установить Cygwin (toolkit предоставляет инструменты Unix на платформе Windows) из (http://ptolemy.eecs.berkeley.edu/ptolemyII/ptII4.0/cygwin.htm).
скачать и установитьcygwingDevel.exe
- получить gnumex архив через (https://sourceforge.net/projects/gnumex) и извлечь gnumex в (
$MATLABHOME\gnumex
).
здесь$MATLABHOME
было бы, например (C:\Program Files\MATLAB\R2010a
) - добавить этот каталог (
$MATLABHOME\gnumex
) к пути Matlab (File->Set Path
в Matlab).
Примечание: запустите Matlab с Администратором привилегии. -
в Matlab введите
gnumex
в командной строке. Заполните соответствующие пути, такие как;MinGW_Root = C:\MinGW32, Cygwin_Root=C:\cygwin
Do'
File->Save Config
', затем нажмите 'Make Options file
'. Выход из окна настройки gnumex.
тестирование:
скопировать mexopts.летучая мышь!--38--> (%AppData%\MathWorks\MATLAB\R2010a\mexopts.bat
) в рабочий каталог (%UserProfile%\Documents\MATLAB
) для этого теста.
-
в matlab выполните следующее в командной строке;
mex-f mexopts.летучая мышь "C:\Program файлы\MATLAB\R2010a\extern\examples\mex\yprime.c"
-
вы получили (
%UserProfile%\Documents\MATLAB\yprime.mexw32
) при вводе;что yprime
запустите его, набрав в MATLAB prompt
>> yprime(1,1:4)
и посмотреть, если вы получите2.0000 8.9685 4.0000 -1.0947
.- теперь просто скопируйте mexopts.летучая мышь!--38--> to
$MATLABHOME\bin
и он должен работать в любом месте.
Matlab на платформе Linux:
-
в командной строке Linux установите следующее:
судо apt-получить установку компилятором gfortran ССЗ г++
-
в Matlab выполните следующее в командной строке;
mex-setup
-
файлы опций, доступные для 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:
sudo apt-get install gcc-4.4 g++-4.4 gfortran-4.4
sudo gedit /usr/local/MATLAB/R2012b/bin/mexopts.sh
- изменить
'gcc'
до'gcc-4.4'
,'g++'
to'g++-4.4'
,'gfortran'
to'gfortran-4.4'
во всех случаяхCC = 'gcc'
,CXX = 'g++'
иFC = 'gfortran'
. - сохраните файл и выйдите.
почему так много шагов? Если у вас есть Matlab 2016 или выше, просто сделать:
- скачать по MinGW и установить в папку без пробелов (т. е. не в "Program Files")
- добавить
MW_MINGW64_LOC
переменная среды, указывающая на папку установки (то же самое, что вы ввели в установщик) - перезагрузите компьютер
- откройте MATLAB и введите
mex -setup
в консоли. Он должен сказать: "настроен на использование Компилятор MinGW" - запустите / скомпилируйте программу 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, поэтому:
sudo yum install mingw64-gcc mingw64-gcc-c++
- скопируйте из Windows Matlab установите оба
extern/include
иbin/win64
каталоги (на самом деле вам, вероятно, нужно только подмножество заголовков И небольшое подмножество DLL;libmat.dll libmex.dll libmx.dll
может будь всем, что тебе нужно. Я поместил эти два каталога в новыйR2010a-w64
каталог в моем существующем каталоге Linux MATLAB; измените приведенные ниже команды, соответствующие тому, где вы спрятали заголовки и библиотеки Windows. - была одна проблема, с которой я столкнулся, а именно:
char16_t
необходимаmatrix.h
и не определился. Я думаюmatrix.h
забыли включитьuchar.h
? Я работал с
это подробный walkthorugh ответ. Поэтому все заслуги должны идти на что ответ.
1 установить MinGW-w64:
1.1 загрузите эту сборку MinGW64-w64 и ее update:
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, вы можете использовать этот способ. Имейте это в виду, что вам нужно изменить пути в соответствии с вашими путями установки.
- на Mingw-w64 официальный сайт перенаправляет вас на Win-builds проект, который является менеджером пакетов для пакета инструментов разработки с открытым исходным кодом. Итак, сначала вам нужно установить Win-builds.
- при установке Win-builds убедитесь, что вы вводите путь, который не содержит пробелов например
C:\Win-builds
. - после установки Win-builds просто нажмите
Process
кнопка для установки всех пакетов, где Mingw-w64 находится среди них. - теперь, когда вы установили Mingw-w64, вам нужно определить
MW_MINGW64_LOC
переменной окружения, которая Matlab использует его для обнаружения Mingw-w64. - определить переменная среды выполните следующие действия:
панель управления\ System\ Advanced system settings\ Advanced\ переменная среды\ пользовательские переменные для $YOUR_USER_NAME\ New
- поставить
Variable name = MW_MINGW64_LOC
иVariable value = C:\Win-builds
. Обратите внимание, что Win-builds помещает все исполняемые файлы вC:\Win-builds\bin
и, определив эту переменную, Matlab автоматически сканируетbin
папка пути ищетgcc.exe
. - теперь, когда вы установили Mingw - w64 и определяете the
MW_MINGW64_LOC
переменные среды, пришло время построить и протестировать пример yprime. Поэтому запустите Matlab и введите следующую команду (не забудьте соответствующим образом изменить путь):mex-v 'C:\Program файлы\MATLAB\R2016b\extern\examples\mex\yprime.c'
- Успешная установка покажет следующее сообщение:
MEX успешно завершен.
- наконец, вы можете проверить ваша установка, набрав
yprime(1,1:4)
. Ответ будет:ans = 2.0000 8.9685 4.0000 -1.0947
в linux, если вы вводите mex -setup
, вы можете выбрать компилятор.
в windows, вы должны попытаться установить lcc, вы можете сделать это, например, установив Microsoft Visual Studio Express, который является бесплатным.