Подтвердить что ты не робот

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

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

Любая идея, как настроить его?

4b9b3361

Ответ 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.