Использование GCC (MinGW) в качестве компилятора MATLAB MEX
Мне предоставлен проект для запуска на MATLAB R2011a. Поскольку там есть несколько файлов .c, мне нужно настроить GCC как компилятор MEX для этого проекта. Однако я не могу найти никаких объяснений относительно того, как его настроить. Я пробовал программу script, называемую gnumex, но она не удалась (возможно, настроена для более старой версии MATLAB).
Любая идея, как настроить его?
Ответы
Ответ 1
В 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*
Поместите этот make файл в каталог исходного кода и make
. Нет необходимости конвертировать dll файлы.
Ответ 2
Почему бы не настроить файл 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
Это означает, что вы находитесь в бизнесе. Удачи!
EDIT Oct 2014: Теперь я использую улучшенный файл mexopts.bat, чем выше, с другим MinGW64 (дает немного более быстрый двоичный код, чем TDM). Подробнее и загрузите мою домашнюю страницу.
Ответ 3
По состоянию на MATLAB R2015b официально поддерживается MinGW!
Теперь он находится в верхней части списка списка поддерживаемых компиляторов.
См. здесь для официальных инструкций для загрузки MinGW (они рекомендуют TDB-GCC).
Есть несколько ограничений и предостережений, перечисленных (например, не связывайтесь с библиотеками, скомпилированными с другими компиляторами, вы должны поймать свои исключения внутри файл MEX и т.д.).
Ниже мой старый способ сделать XML файл сделать то же самое.
Прошедшие годы и MATLAB (начиная с R2014a) переместился в новую систему на основе XML для настройки файлов MEX. MATLAB по-прежнему временно поддерживает устаревшие .bat файлы, но теперь беспокоит вас об этом. Другое изменение - это различные конфигурации 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 я разместил конфигурации С++ для MinGW-w64 в обоих типах файлов: mex_С++ _ mingw-w64.xml и устаревшее mingw_mexopts.bat. Начните с этого в качестве шаблона и (необязательно) отредактируйте XML файл с описательным именем и версией дистрибутива MinGW, который вы загрузили и извлекли.
- Установить (или создать) переменную среды
MINGWROOT
. Это то, что позволяет команде mex
найти компилятор. Вы можете сделать это в MATLAB (и каждый раз, когда MATLAB начинается с startup.m
script в userpath
) с setenv
, или только один раз с диалоговым окном свойств Windows или собственной командой Windows 7 setx.exe.
-
Запустите mex -setup:C:\actual\configFilePath.xml C++
. Например, используя файл .xml для настройки компиляции файлов С++ 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 аналогичным образом с новым файлом конфигурации XML, определяющим язык C, интерфейсом компилятора C (например, "x86_64-w64-mingw32-gcc.exe", который не будет автоматически связывать Стандартная библиотека С++), при необходимости отредактируйте библиотеки ссылок, флаги компилятора (например, измените -std=c++11
на -std=c99
) и т.д.
Примечание о статической и динамической компоновке библиотек времени выполнения
Библиотеки, такие как MEX файл, созданный с помощью MinGW-w64, как указано выше, могут зависеть от нескольких DLL (во время выполнения): LIBGCC_S_SEH-1.DLL(для отдельных дистрибутивов) и LIBSTDС++ - 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++
Ответ 4
РЕДАКТИРОВАТЬ: Кажется, что с MinGW намного лучший способ; см. мой другой ответ.
Вы можете скомпилировать файл .mex
с помощью gcc
, если у вас установлена Matlab
из командной строки. Некоторые могут сказать, что это немного утомительно в первый раз.
Прежде всего, что вы используете в Matlab? если он 64-битный, MinGW
вам не поможет, потому что он 32-разрядный. Поэтому я покажу, как использовать MinGW-w64. Понимание того, как это сделать с 32-разрядным 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
вам нужно экспортировать, создать файл .def
, содержащий
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(...)
).
Ответ 5
MinGW
способен прямая ссылка 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
Ответ 6
Ссылки Matlab на внешний код (С++, Fortran, Java и т.д.) с использованием файлов MEX. (http://gnumex.sourceforge.net/)
Настройка компилятора:
- Установите TDM-GCC (компилятор С++
"C:\MinGW32\bin;"
) из http://tdm-gcc.tdragon.net/download
- Установить Cygwin (инструментарий предоставляет инструменты 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
-
Сделайте "File->Save Config
", затем нажмите "Make Options file
". Выход из окна настройки gnumex.
Тестирование:
Скопируйте mexopts.bat (%AppData%\MathWorks\MATLAB\R2010a\mexopts.bat
) в рабочий каталог (%UserProfile%\Documents\MATLAB
) для этого теста.
-
В matlab выполните следующее в командной строке;
mex -f mexopts.bat "C:\Program Files\MATLAB\R2010a\extern\examples\mex\yprime.c"
-
Вы получаете (%UserProfile%\Documents\MATLAB\yprime.mexw32
) при вводе;
который yprime
-
Запустите его, набрав приглашение Matlab >> yprime(1,1:4)
и посмотрим, получится ли вы 2.0000 8.9685 4.0000 -1.0947
.
- Теперь просто скопируйте mexopts.bat в
$MATLABHOME\bin
, и он должен работать в любом месте.
Matlab на платформе Linux:
-
В командной строке Linux установите следующее:
sudo apt-get install gcc g++ 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++'
на 'g++-4.4'
, 'gfortran'
на 'gfortran-4.4'
во всех экземплярах CC = 'gcc'
, CXX = 'g++'
и FC = 'gfortran'
.
- Сохраните файл и выйдите.
Ответ 7
Почему так много шагов? Если у вас есть Matlab 2016 или выше, просто выполните:
- Загрузите mingw и установите в папку без пробелов (т.е. не в "программные файлы" )
- Добавьте переменную среды
MW_MINGW64_LOC
, указывающую на папку установки (то же самое, что вы ввели в установщик)
- Перезагрузите компьютер.
- Откройте MATLAB и введите
mex -setup
в консоль. Он должен сказать: "настроен на использование MinGW"
- Запустить/скомпилировать вашу программу MATLAB
Я тестировал их на новом ПК с Windows 10, и он работает!
Ответ 8
Это работает на Matlab 2012b под Windows 8:
https://github.com/DynareTeam/dynare/blob/master/windows/mexopts-win64.bat
Измените каталог cgwin или замените его на каталог mingw, если он используется. Вы также можете заменить команду-exe, если вы переключитесь на 64-битную версию.
Ответ 9
В 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
Мне потребовалось много времени, чтобы добраться до этого момента, удачи.
Ответ 10
Первоначально я думал, что это звучит как форма пытки, но на основе приведенного выше ответа от пользователя @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
? Я работал с директивой -include
; см. ниже.
-
x86_64-w64-mingw32-gcc -m64 -shared -include uchar.h -I/opt/MATLAB/R2010a-w64/extern/include -DMATLAB_MEX_FILE -L/opt/MATLAB/R2010a-w64/bin/win64 -o bla.mexw64 bla.c -lmx -lmex
- (Вам могут понадобиться дополнительные библиотеки для связывания, например, -lmat -leng -lm и т.д.).
- Это успешно создает файл mex, исполняемый в Windows Matlab для моей установки. До сих пор я тестировал это только с помощью довольно простых программ на C.
Заинтересоваться, если это звучит разумно; У меня нет большого опыта в кросс-компиляции.
Ответ 11
Это подробный обзор этого ответа. Таким образом, весь кредит должен идти .
1 Установите MinGW-w64:
1.1 Загрузите эту сборку MinGW64-w64 и ее обновление:
(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 Разархивируйте файл сборки и переместите результирующую папку mingw64\
в 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:\Program Files\MATLAB\R2012b\
):
"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 должен работать нормально, когда он вызывает функцию CCODEFILE
.
Ответ 12
Если вы не смогли установить Mingw-w64 с помощью панели инструментов надстройки Matlab2016b в Windows, вы можете использовать это обходное решение. Имейте это в виду, что вам необходимо изменить пути в соответствии с вашими установками.
- Mingw-w64 официальный сайт перенаправляет вас на Win-builds, который является менеджером пакетов для набора инструментов для разработки с открытым исходным кодом. Итак, сначала вам нужно установить Win-сборки.
- При установке Win-builds убедитесь, что вы входите в путь, который не содержит пробелов, например.
C:\Win-builds
.
- После установки Win-builds просто нажмите кнопку
Process
, чтобы установить все пакеты, среди которых Mingw-w64.
- Теперь, когда вы установили Mingw-w64, вам нужно определить переменную среды
MW_MINGW64_LOC
, которая Matlab использует ее для обнаружения Mingw-w64,
- Чтобы определить переменную окружения, выполните следующие действия:
Панель управления\система\расширенные системные настройки\расширенные\переменные среды\переменные пользователя для $YOUR_USER_NAME\New
- Поместите
Variable name = MW_MINGW64_LOC
и Variable value = C:\Win-builds
. Обратите внимание, что Win-сборки помещают все исполняемые файлы в C:\Win-builds\bin
и, определяя эту переменную, Matlab автоматически сканирует папку bin
пути, ищущего gcc.exe
.
- Теперь, когда вы установили Mingw-w64 и определили переменную среды
MW_MINGW64_LOC
, пришло время построить и протестировать пример yprime, Итак, запустите Matlab и введите следующую команду (не забудьте изменить путь соответственно):
mex -v 'C:\Program Files\MATLAB\R2016b\extern\examples\mex\yprime.c'
- Успешная установка покажет следующее сообщение:
MEX успешно завершен.
- Наконец, вы можете протестировать свою установку, набрав
yprime(1,1:4)
. Ответ будет следующим:
ans = 2.0000 8.9685 4.0000 -1.0947
Ответ 13
В linux, если вы наберете mex -setup
, вы можете выбрать компилятор.
В Windows вы должны попробовать установить lcc, вы можете сделать это, например, установив бесплатный Microsoft Visual Studio Express.