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?
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.
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.
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:
- 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).
- 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 commandemex
1519370920". Vérifiez votre variable d'environnementPATH
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. - 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 .
- définir (ou créer) la variable d'environnement
MINGWROOT
. C'est ce qui permet à la commandemex
de localiser le compilateur. Vous pouvez le faire dans MATLAB (et chaque fois que MATLAB commence avec un scriptstartup.m
dansuserpath
) avecsetenv
, 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 . -
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èquestelles 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++
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.
- ajouter
C:\MinGW-64\bin\
à votre chemin. Vous ne le regretterez pas:) -
compilez vos
.c
fichiers utilisantgcc
: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
-
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
etlibeng.dll
(vous pourriez avoir d'autres, mais ce sont les principaux) -
Liste des fonctions que vous êtes absent, et, eh bien, devinez ce que
dll
ils viennent. Indice:mexErrMsgTxt
est delibmex.dll
, parce qu'il commence par"mex"... -
pour chaque
dll
vous devez exporter, créer un.def
fichier contenantEXPORTS ... relevant function names go here, such as mexErrMsgTxt, matOpen, etc.
-
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
) -
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(...)
).
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
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:
- Installer TDM-GCC (Compilateur C++
"C:\MinGW32\bin;"
) de http://tdm-gcc.tdragon.net/download - 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 installercygwingDevel.exe
- obtenir le gnumex archive via ( https://sourceforge.net/projects/gnumex ) et extraire le gnumex vers (
$MATLABHOME\gnumex
).
où$MATLABHOME
serait par exemple (C:\Program Files\MATLAB\R2010a
) - 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. -
dans Matlab, tapez
gnumex
à l'invite.MinGW_Root = C:\MinGW32, Cygwin_Root=c:\cygwin
-
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.
-
Dans matlab, exécutez la commande suivante à l'invite;
mex-f mexopts.bat "C:\Program fichiers\MATLAB\R2010a\extern\examples\mex\yprime.c "
-
vous obtenez (
%UserProfile%\Documents\MATLAB\yprime.mexw32
) lorsque vous tapez;qui yprime
-
exécutez-le en tapant à L'invite Matlab
>> yprime(1,1:4)
et voyez si vous obtenez2.0000 8.9685 4.0000 -1.0947
. - maintenant, copiez mexopts.bat à
$MATLABHOME\bin
et il devrait fonctionner de n'importe où.
sur Matlab Plate-Forme Linux:
-
à L'invite Linux, installez ce qui suit;
sudo apt-get install gcc g++ gfortran
-
Dans Matlab, exécutez la commande suivante à l'invite;
mex -installation
-
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:
-
sudo apt-get install gcc-4.4 g++-4.4 gfortran-4.4
-
sudo gedit /usr/local/MATLAB/R2012b/bin/mexopts.sh
- changer
'gcc'
en'gcc-4.4'
,'g++'
en'g++-4.4'
,'gfortran'
en'gfortran-4.4'
dans tous les cas deCC = 'gcc'
,CXX = 'g++'
etFC = 'gfortran'
. - Enregistrer le fichier et quitter.
pourquoi autant de pas? Si vous avez Matlab 2016 ou plus , faites juste:
- Télécharger mingw et de l'installer dans un dossier sans espaces (ie. pas dans "Program Files")
- 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) - redémarrer votre PC
- MATLAB ouvert et type
mex -setup
dans la console. Il devrait être écrit "configuré pour utiliser MinGW" - exécuter / compiler votre programme MATLAB
j'ai testé ces derniers sur un nouveau PC Windows 10 et cela fonctionne!
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.
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.
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:
-
sudo yum install mingw64-gcc mingw64-gcc-c++
- copier à partir D'un Matlab Windows Installer à la fois les répertoires
extern/include
etbin/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épertoireR2010a-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. - il y avait un problème que j'ai rencontré, qui est que
char16_t
était nécessaire dansmatrix.h
et n'a pas été défini. Je suppose quematrix.h
a oublié d'inclureuchar.h
? J'ai travaillé avec un-include
directive; voir ci-dessous. -
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
- (vous pouvez avoir besoin de bibliothèques supplémentaires pour le lien, par exemple-lmat-leng-lm, etc.)
- 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.
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:
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
.
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.
- 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.
- lors de l'installation de Win-builds, assurez-vous d'entrer un chemin qui ne contient pas d'espaces par exemple
C:\Win-builds
. - 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. - 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 . - 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
- Mettre
Variable name = MW_MINGW64_LOC
etVariable value = C:\Win-builds
. Notez que les gains mettent tous les exécutables dansC:\Win-builds\bin
et en définissant cette variable, Matlab, scanne automatiquement le dossierbin
du chemin à la recherche degcc.exe
. - 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 '
- une installation réussie montrera le message suivant:
MEX terminé avec succès.
- 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
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.