Utilisation de GCC (MinGW) comme compilateur MEX de MATLAB

on m'a confié un projet à exécuter sur MATLAB R2011a. Comme il y en a plusieurs .c fichiers - J'ai besoin de configurer GCC comme compilateur MEX pour ce projet. Cependant, je ne vois aucune explication quant à la façon de le mettre en place. J'ai essayé un script appelé gnumex - mais il a échoué (probablement mis en place pour une version plus ancienne de MATLAB).

une idée de comment l'installer?

20
demandé sur Joel Almeida 2011-12-18 19:05:03

13 réponses

dans Matlab 2011b, compilez et liez directement dans l'environnement mingw64 ou 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*

mettez ce makefile sur le répertoire de code source et make . Pas de conversion de fichiers dll nécessaire.

14
répondu Richard Dualmann 2013-12-09 06:29:20

pourquoi ne pas ajuster les mexopts.chauve-souris de fichier dans votre répertoire? De cette façon, vous pouvez utiliser la commande "mex" de manière transparente pour compiler n'importe quoi, comme D'habitude dans MATLAB, comme si elle avait été configurée par MATLAB en utilisant mex -setup . Je suis surpris que personne n'ait fait ça avant.

le fichier ci-dessous est pour la version x64 de Matlab et Mingw. J'utilise la distribution TDM Mingw64 , que j'ai installée dans p:\mingw64-tdm . J'ai installé Matlab dans p:\matlab\R2012a -- modifier ceux en conséquence.

ici mexopts.bat fichier que j'utilise, copier coller ce dans %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%"

alors vous pouvez juste essayer de le faire dans Matlab:

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

devrait donner b:\code\m\yprime.mexw64 (ou quel que soit le dossier actuel). Alors si vous le faites:

yprime(1,1:4)

vous devriez voir:

ans =
    2.0000    8.9685    4.0000   -1.0947

ce qui veut dire que vous êtes en affaires. Bonne chance!

EDIT Oct 2014: j'utilise maintenant un mexopts amélioré.bat file que le ci-dessus avec un MinGW64 différent (donne un code binaire légèrement plus rapide que TDM). Voir ma page d'accueil pour plus de détails et pour télécharger.

12
répondu Bogdan 2015-01-05 16:18:31

depuis MATLAB R2015b, MinGW est officiellement soutenu!

il est maintenant en haut de la liste des compilateurs supportés .

voir ici pour les instructions officielles pour télécharger MinGW (ils recommandent TDB-GCC).

Il y a plusieurs limites et mises en garde figurant (par exemple, ne pas le lien avec les bibliothèques compilées avec d'autres compilateurs, vous vous devez saisir vos exceptions dans le fichier MEX, etc.).

ci-dessous est mon ancienne façon de faire un fichier XML pour faire la même chose.


les années ont passé et MATLAB (à partir de R2014 A) a déménagé à un nouveau système basé sur XML pour la configuration des fichiers MEX. MATLAB soutient encore momentanément legacy .Fichiers bat, pour l'instant, mais il va vous ennuyer à ce sujet . Un autre changement est que sont des configurations C et c++ distinctes (plus tard).

ce qui est resté le même est que vous avez juste besoin de télécharger et d'extraire une distribution MinGW et MATLAB point à elle. Il y a still pas besoin de MSYS, cygwin ou gnumex. La seule partie délicate est de pointer MATLAB vers elle, Mais voici une solution.

Version Courte

  • télécharger et extraire un MinGW distribution. Choisissez une, telle que MinGW-w64 (64-bit) ou TDM-GCC (32-bit et 64-bit options).
  • personnaliser le fichier de configuration XML, en utilisant celui-ci comme modèle (détails dans la version longue ci-dessous).
  • Set MINGWROOT variable d'environnement.
  • Exécuter mex -setup:[xmlfile] [C|C++] .

Version Longue

pour MinGW-w64, je fais ce qui suit pour le mettre en place:

  1. saisissez la dernière révision pour w64 de Sourceforge (ou utilisez l'installateur pour choisir la chaîne d'outils que vous voulez, en choisissant une version pthread ou Win32 threads en fonction de vos besoins).
  2. Extrait de sorte que vous avez un chemin vers le compilateur comme C:\mingw-w64\x86_64-4.9.2-release-posix-seh-rt_v3-rev1\bin\x86_64-w64-mingw32-g++.exe . pas besoin de MSYS, cygwin, ou tout autre environnement si vous prévoyez de compiler dans MATLAB avec la commande mex 1519370920". Vérifiez votre variable d'environnement PATH pour vous assurer que vous n'avez pas plusieurs compilateurs ( g++ ) sur votre chemin, de préférence aucun. Vérifier avec une nouvelle invite de commande.
  3. L'a configuré avec un fichier de configuration XML personnalisé. Sur mon github repo, j'ai posté des configurations C++ Pour MinGW-w64 dans les deux types de fichiers: mex_C++_mingw-w64.XML et l'héritage mingw_mexopts.chauve-souris . Commencez avec cela comme un modèle et (optionnellement) éditez le fichier XML avec un nom descriptif et la version de la distribution MinGW que vous avez téléchargé et extrait .
  4. définir (ou créer) la variable d'environnement MINGWROOT . C'est ce qui permet à la commande mex de localiser le compilateur. Vous pouvez le faire dans MATLAB (et chaque fois que MATLAB commence avec un script startup.m dans userpath ) avec setenv , ou une seule fois avec la boîte de dialogue propriétés de Windows ou la fenêtre d'origine de Windows 7 setx.exe commande .
  5. Exécuter mex -setup:C:\actual\configFilePath.xml C++ . Par exemple, en utilisant le .fichier xml pour configurer la compilation de fichiers 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++
    

    la sortie doit ressembler à ceci:

    MEX configuré pour utiliser 'MinGW-w64 GCC 4.9.2 posixthreads seh' pour la compilation de langue C++.

si nécessaire, configurer le compilateur C de la même manière avec un nouveau fichier de configuration XML spécifiant le langage C, le compilateur C frontend (par exemple" x86_64-w64-mingw32-gcc.exe " qui ne liera pas automatiquement la bibliothèque standard C++), réglez les bibliothèques de liens au besoin, composez des options (par exemple, changez -std=c++11 en -std=c99 ), etc.


Note sur le lien statique vs. dynamique des bibliothèques d'exécution

Les bibliothèques

telles qu'un fichier MEX créé avec MinGW-w64 comme ci-dessus peuvent dépendre de quelques DLLs (à l'exécution): LIBGCC_S_SEH-1.DLL (pour les distributions d'exception de seh) et LIBSTDC++-6.DLL, et peut-être libwinpthread-1.dll si vous avez choisi une distribution pthreads au lieu de Win32 threads. Si vous ne souhaitez pas copier ces fichiers autour, vous pouvez lier statiquement les bibliothèques runtime dans votre fichier MEX en ajoutant les commutateurs suivants:

-static-libgcc -static-libstdc++

il y a un commentaire à ce sujet dans le modèle XML. Voir ici pour des informations sur libpthread-1.DLL.

avec TDM-GCC, le contraire est vrai : les durées d'exécution (y compris pthread) sont liées statiquement automatiquement. Pour se connecter dynamiquement, ce qui nécessitera le DLLs mais réduisez la taille de votre fichier MEX, vous avez besoin de:

-shared-libgcc -shared-libstdc++
8
répondu chappjc 2017-05-23 12:34:54

EDIT: Il semble y avoir une bien meilleure façon avec MinGW; voir mon autre réponse.

vous pouvez compiler un fichier .mex en utilisant gcc si vous avez Matlab installé, à partir de la ligne de commande. Certains pourraient dire que c'est un peu fastidieux la première fois.

premières choses d'abord - quel Matlab utilisez-vous? si c'est 64 bits, MinGW ne vous aidera pas, parce que c'est 32 bits. Je vais donc montrer comment l'utiliser MinGW-w64 à la place. Comprendre comment faire avec 32 bits MinGW devrait être simple.

  1. ajouter C:\MinGW-64\bin\ à votre chemin. Vous ne le regretterez pas:)
  2. compilez vos .c fichiers utilisant 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. il en résultera un tas d'erreurs de connexion, telles que

    undefined reference to `mexErrMsgTxt'
    

    à résoudre ce problème, vous devrez créer une bibliothèque d'importation qui se connecte avec libmex.dll , libmx.dll , libmat.dll et libeng.dll (vous pourriez avoir d'autres, mais ce sont les principaux)

  4. Liste des fonctions que vous êtes absent, et, eh bien, devinez ce que dll ils viennent. Indice: mexErrMsgTxt est de libmex.dll , parce qu'il commence par"mex"...

  5. pour chaque dll vous devez exporter, créer un .def fichier contenant

    EXPORTS
    ... relevant function names go here, such as mexErrMsgTxt, matOpen, etc.
    
  6. exécutez la commande suivante, pour créer des bibliothèques d'importation:

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

    (idem pour le reste des fichiers .def )

  7. Maintenant, vous pouvez y aller!

    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
    

des choses qui peuvent être mieux faites - plutôt --export-all-symbol , exportez seulement mexFunction (nécessite la création d'un autre fichier .def , ou l'ajout de " __declspec(dllexport) "avant void mexFunction(...) ).

6
répondu user1071136 2013-12-08 05:57:32

MinGW est capable de direct-liaison d'un DLL ; qu'il est, il va créer une sorte de bibliothèque d'importation à la volée lors de la liaison.

cela signifie que la compilation peut être effectuée en une seule étape:

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
3
répondu user1071136 2012-02-26 12:33:21

Matlab établit des liens vers du code externe (C++, Fortran, Java, etc.) en utilisant des fichiers MEX. ( http://gnumex.sourceforge.net / )

mise en place du compilateur:

  1. Installer TDM-GCC (Compilateur C++ "C:\MinGW32\bin;" ) de http://tdm-gcc.tdragon.net/download
  2. Installer Cygwin (boîte à outils fournit des outils Unix sur Windows plate-forme) de ( http://ptolemy.eecs.berkeley.edu/ptolemyII/ptII4.0/cygwin.htm ).

    télécharger et installer cygwingDevel.exe
  3. obtenir le gnumex archive via ( https://sourceforge.net/projects/gnumex ) et extraire le gnumex vers ( $MATLABHOME\gnumex ).

    $MATLABHOME serait par exemple ( C:\Program Files\MATLAB\R2010a )
  4. ajouter ce qui suit: répertoire ( $MATLABHOME\gnumex ) du chemin Matlab ( File->Set Path dans Matlab).

    Remarque: Exécutez Matlab, avec des privilèges d'Administrateur.
  5. dans Matlab, tapez gnumex à l'invite.

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

  6. faire " File->Save Config ", puis cliquer sur " Make Options file ". Sortie de gnumex configurez la fenêtre.

Test:

Copie mexopts.bat ( %AppData%\MathWorks\MATLAB\R2010a\mexopts.bat ) vers le répertoire de travail ( %UserProfile%\Documents\MATLAB ) pour cet essai.

  1. Dans matlab, exécutez la commande suivante à l'invite;

    mex-f mexopts.bat "C:\Program fichiers\MATLAB\R2010a\extern\examples\mex\yprime.c "

  2. vous obtenez ( %UserProfile%\Documents\MATLAB\yprime.mexw32 ) lorsque vous tapez;

    qui yprime

  3. exécutez-le en tapant à L'invite Matlab >> yprime(1,1:4) et voyez si vous obtenez 2.0000 8.9685 4.0000 -1.0947 .

  4. maintenant, copiez mexopts.bat à $MATLABHOME\bin et il devrait fonctionner de n'importe où.

sur Matlab Plate-Forme Linux:

  1. à L'invite Linux, installez ce qui suit;

    sudo apt-get install gcc g++ gfortran

  2. Dans Matlab, exécutez la commande suivante à l'invite;

    mex -installation

  3. les fichiers d'options disponibles pour mex sont: **1**: /usr/local/MATLAB/R2012b/bin/mexopts.sh : Sélectionnez l'option 1 . Pour tester le fonctionnement, exécutez ce qui suit à L'invite Matlab:

    mex " /usr/local/MATLAB/R2012 b/extern/examples/mex / yprime.c "

    yprime (1,1:4)

Dans le cas où vous obtenez le message d'avertissement;

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/

sous Linux prompt:

  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. changer 'gcc' en 'gcc-4.4' , 'g++' en 'g++-4.4' , 'gfortran' en 'gfortran-4.4' dans tous les cas de CC = 'gcc' , CXX = 'g++' et FC = 'gfortran' .
  4. Enregistrer le fichier et quitter.
1
répondu Faheem 2013-05-16 11:06:12

pourquoi autant de pas? Si vous avez Matlab 2016 ou plus , faites juste:

  1. Télécharger mingw et de l'installer dans un dossier sans espaces (ie. pas dans "Program Files")
  2. ajouter la variable d'environnement MW_MINGW64_LOC pointant vers le dossier d'installation (la même chose que vous avez tapée dans l'installateur)
  3. redémarrer votre PC
  4. MATLAB ouvert et type mex -setup dans la console. Il devrait être écrit "configuré pour utiliser MinGW"
  5. exécuter / compiler votre programme MATLAB

j'ai testé ces derniers sur un nouveau PC Windows 10 et cela fonctionne!

1
répondu Robinicks 2017-03-11 15:48:15

celui-ci fonctionne sur Matlab 2012b sous Windows 8:

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

modifier le répertoire cgwin ou le remplacer par le répertoire mingw s'il est utilisé. Vous pouvez également echange le compilateur-exe si vous passez à une version 64 bits.

0
répondu pete 2013-05-16 11:14:38

dans Windows 64 bit avec R2011a il a travaillé avec http://tdm-gcc.tdragon.net / et http://gnumex.sourceforge.net / mais je dois changer maxopt.bat ligne entrée GM_ADD_LIBS comme suit:

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 

il m'a fallu beaucoup de temps pour en arriver là, bonne chance.

0
répondu rarias 2013-11-23 15:27:17

j'ai d'abord pensé que cela sonnait comme une forme de torture, mais sur la base de la réponse ci-dessus par @user10171136 j'ai en fait trouvé assez simple de compiler Pour Windows mex à partir de Fedora Linux. Fedora a mingw et mingw64 paquets, donc:

  1. sudo yum install mingw64-gcc mingw64-gcc-c++
  2. copier à partir D'un Matlab Windows Installer à la fois les répertoires extern/include et bin/win64 (en fait, vous n'avez probablement besoin que d'un sous-ensemble des en-têtes et un petit sous-ensemble des dlls; libmat.dll libmex.dll libmx.dll pourrait être tout ce dont vous avez besoin. Je mets ces deux répertoires dans un nouveau répertoire R2010a-w64 sous mon répertoire Linux MATLAB existant; changez les commandes ci-dessous appropriées pour l'endroit où vous avez caché les en-têtes et les libs de Windows.
  3. il y avait un problème que j'ai rencontré, qui est que char16_t était nécessaire dans matrix.h et n'a pas été défini. Je suppose que matrix.h a oublié d'inclure uchar.h ? J'ai travaillé avec un -include directive; voir ci-dessous.
  4. 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
  5. (vous pouvez avoir besoin de bibliothèques supplémentaires pour le lien, par exemple-lmat-leng-lm, etc.)
  6. cela génère avec succès un fichier mex qui est exécutable sous Windows Matlab pour mon installation. Jusqu'à présent, je n'ai testé cela qu'avec des programmes C assez simples.

intéressé à savoir si cela semble raisonnable; je n'ai pas beaucoup d'expérience avec la compilation croisée.

0
répondu Chinasaur 2013-12-09 05:18:00

c'est un walthorugh détaillé de cette réponse . Par conséquent, tout le crédit devrait aller à qui répond .

1 Installer MinGW - w64:

1.1 télécharger cette construction MinGW64-w64 et sa mise à jour:

( 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 Installer (décompressez) le téléchargement des archives:

1.2.1 décompresser le fichier de compilation et déplacer le dossier mingw64\ dans c:\

1.2.2 décompresser et copier (écraser) le fichier de mise à jour sur c:\mingw64

1.3 ajouter C:\mingw64\bin à la variable Path:

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

2 sur une ligne de commande (en dehors de L'environnement Matlab), compilez votre *.c fichiers: par exemple, CCODEFILE.c (en supposant que Matlab 2012b est installé dans le dossier 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 alors, tout code Matlab devrait fonctionner correctement lorsqu'il appelle la fonction CCODEFILE .

0
répondu imriss 2017-05-23 10:30:11

si vous ne pouviez pas installer Mingw-w64 en utilisant la barre D'outils Add-Ons de Matlab2016b sur Windows , vous pouvez utiliser cette solution. Gardez ceci à l'esprit que vous devez changer les chemins en fonction de vos chemins d'installation.

  1. le Mingw-w64 le site officiel vous redirige vers Win-builds project qui est un gestionnaire de paquets pour un paquet d'open source outils de développement. Donc, vous devez d'abord installer le Win-construit.
  2. lors de l'installation de Win-builds, assurez-vous d'entrer un chemin qui ne contient pas d'espaces par exemple C:\Win-builds .
  3. après l'installation de Win-builds, il suffit d'appuyer sur le bouton Process pour installer tous les paquets où Mingw-w64 est parmi eux.
  4. maintenant que vous avez installé Mingw-w64, vous devez définir l'environnement MW_MINGW64_LOC variable que Matlab utilise pour détecter Mingw-w64 .
  5. pour définir la variable d'environnement Faire les étapes suivantes:

    panneau de configuration\ Système\ Advanced system settings\ Advanced\ Variable d'Environnement\ variables Utilisateur pour $YOUR_USER_NAME\ Nouveau

  6. Mettre Variable name = MW_MINGW64_LOC et Variable value = C:\Win-builds . Notez que les gains mettent tous les exécutables dans C:\Win-builds\bin et en définissant cette variable, Matlab, scanne automatiquement le dossier bin du chemin à la recherche de gcc.exe .
  7. maintenant que vous avez installé le Mingw-w64 et défini la variable d'environnement MW_MINGW64_LOC , il est temps de construire et de tester le exemple yprime . Alors lancez Matlab et tapez la commande suivante (n'oubliez pas de modifier le chemin en conséquence):

    mex-v 'C:\Program Fichiers\MATLAB\R2016b\extern\examples\mex\yprime.c '

  8. une installation réussie montrera le message suivant:

    MEX terminé avec succès.

  9. Enfin, vous pouvez tester votre installation en tapant yprime(1,1:4) . La réponse serait:

    ans = 2.0000 8.9685 4.0000 -1.0947

0
répondu hmofrad 2017-01-08 16:14:08

Sur linux, si vous tapez mex -setup , vous pouvez choisir le compilateur.

sous windows, vous devez essayer d'installer lcc, vous pouvez le faire par exemple en installant Microsoft Visual Studio Express, qui est gratuit.

-2
répondu Oli 2011-12-18 16:23:18