web-dev-qa-db-fra.com

Comment construire un fichier mex directement dans Visual Studio?

J'ai une solution Visual Studio 2010 qui contient une bibliothèque de fonctions et j'aimerais pouvoir utiliser MATLAB comme l'un des frontaux possibles de cette bibliothèque. Par conséquent, je souhaiterais que Visual Studio génère automatiquement un fichier mex lors de la génération de la solution, sans avoir à exporter toutes mes options de génération et tous les chemins vers mexopts.bat et à ouvrir MATLAB pour créer le fichier à partir de là. J'ai vu plusieurs suggestions pour réaliser quelque chose de similaire, par exemple dans ces messages:

Matlab 7.1+ et Visual Studio 2005

Compiler un fichier MEX avec Visual Studio

Comment utiliser CMake et Visual Studio 2010 (64 bits) pour créer un fichier mex MATLAB R2011a (64 bits)?

Cependant, ils semblent soit un peu dépassés (faire des références à des fichiers qui ne sont plus disponibles), soit utiliser des outils externes (par exemple, CMake). Est-ce que quelqu'un sait comment configurer un nouveau projet (dans la solution existante) dans Visual Studio (2010 et ultérieur) qui va créer un fichier mex pour les versions actuelles de MATLAB?

17
j0rre

Après quelques expériences avec les conseils de cette page mentionnés dans la question, il semble que, si vous démarrez avec un projet C++ vide, les paramètres suivants dans les pages de propriétés du projet sont nécessaires et suffisants pour créer un fichier .mexw64 fonctionnel à partir de Visual Studio 2010:

 Propriétés de configuration -> Général: 
 Définir l'extension cible à .mexw64 
 Définir le type de configuration sur Bibliothèque dynamique (.dll) 
 
 Configuration configurée - > Répertoires VC++: 
 Add $ (MATLAB_ROOT)\extern\include; inclure des répertoires 
 
 Propriétés de configuration -> Éditeur de liens -> Général: 
 Ajouter $ (MATLAB_ROOT)\extern\lib\win64\Microsoft; vers des répertoires de bibliothèque supplémentaires 
 
 Propriétés de configuration -> Éditeur de liens -> Entrée: 
 Ajoutez libmx.lib; libmex.lib; libmat.lib; Dépendances supplémentaires 
 
 Propriétés de configuration -> Éditeur de liens -> Ligne de commande: 
 Ajouter/exporter: mexFunction à des options supplémentaires 

$(MATLAB_ROOT) est le chemin d'accès au dossier racine de Matlab, par exemple. C:\Program Files\MATLAB\R2013a.

Jusqu'à présent, cela n'a été tenté qu'avec une solution créée à partir de zéro et conçue pour Matlab 2013a 64 bits. Je suppose que pour créer une version 32 bits, il suffit de changer les deux occurrences de 64 à 32. Je mettrai à jour le message dès que j'aurai confirmé que cela fonctionne pour une solution existante.

EDIT: Comme prévu, cela fonctionne pour les projets ajoutés aux solutions existantes. N'oubliez pas de définir le nouveau projet pour qu'il soit dépendant du projet qui crée la bibliothèque.

Éditer 2: Suivant cette question Je peux également confirmer que les étapes ci-dessus fonctionnent également dans Visual Studio 2012, 2013 et 2017.

27
j0rre

Configuration rapide de projets Visual Studio pour les fichiers MEX avec une feuille de propriétés

Tous les paramètres peuvent être appliqués via - feuilles de propriétés, un mécanisme permettant d'appliquer rapidement les configurations de projet Visual Studio.

Pas:

  1. Téléchargez la fiche de propriétés (MATLAB.props) de ce rapport GitHib . C'est court et sympa. Je vous exhorte à faire votre propre pour apprendre ce qui est impliqué dans le processus. Voir la section Détails de la feuille de propriétés ci-dessous pour une description.
  2. Définissez les variables d'environnement racine MATLAB: MATLAB_ROOT pour votre installation MATLAB 64 bits et MATLAB32_ROOT pour toute installation MATLAB 32 bits (par exemple, C:\Program Files\MATLAB\R2014b\). Ce dossier contient les sous-répertoires bin, extern, sys, etc. Redémarrez VS s'il est ouvert.
  3. Créez un projet DLL vide dans Visual Studio, en créant éventuellement une plate-forme de solution x64. Faites ceci en choisissant "Projet Win32" et en sélectionnant DLL comme suit:

enter image description here

  1. Dans "Gestionnaire de propriétés" (sélectionnez dans le menu Affichage), pour la configuration de construction de chaque projet, cliquez avec le bouton droit de la souris et choisissez "Ajouter une feuille de propriétés existante ..." et sélectionnez la feuille de propriétés appropriée (32 ou 64 bits). (Voir capture d'écran ci-dessous)

enter image description here

C'est tout!

N'oubliez pas que lorsque vous passez entre MATLAB pour utiliser votre fichier MEX et Visual Studio pour générer une nouvelle version, il sera nécessaire d'exécuter un clear mex ou un clear specificMEXFileName afin de pouvoir l'écraser. Je construis presque tous mes fichiers MEX. par ici.

UPDATE (22/05/15) : Le fichier MATLAB.props prend désormais en charge la boîte à outils Parallel Computing Toolbox pour l’utilisation des objets mxGPUArray. Si le chemin d'accès à la boîte à outils et la bibliothèque (gpu.lib) existent sur votre ordinateur, ils peuvent être utilisés. Incluez simplement le "Custom Custom Build" de CUDA SDK (à installer si vous avez installé le SDK CUDA et les intégrations de Visual Studio) pour inclure cuda_runtime.h, etc. Enfin, créez un lien avec cudart_static.lib (mais conservez Inherit .. cochée ou vous obtiendrez d'autres erreurs de l'éditeur de liens).


Détails de la feuille de propriétés

Il n'y a que quelques paramètres importants dans la feuille de propriétés:

  1. Ajout de $(MATLAB_ROOT)\extern\include aux chemins AdditionalIncludeDirectories (avec les chemins hérités des configurations parent) - l'emplacement de mex.h.
  2. Ajout de $(MATLAB_ROOT)\extern\lib\win64\Microsoft aux chemins AdditionalLibraryDirectories - l'emplacement de libmex.lib, etc.
  3. Liste des bibliothèques: libut.lib;libmx.lib;libmex.lib;libmat.lib.
  4. Exporter mexFunction (c'est une bibliothèque partagée): /EXPORT:mexFunction.
  5. Définition de l’extension du fichier de sortie (par exemple, .mexw64 pour x64).

Non nécessaire, mais il spécifie également un manifeste de sortie qui n'est PAS incorporé dans la bibliothèque, définit MATLAB_MEX_FILE et active la génération des données requises pour le profilage.

Pour être complet, notez qu’il existe un système " build configuration " plus formel pour la configuration de projet, qui inclut une feuille de propriétés, mais une feuille de propriétés non structurée est suffisante pour configurer un projet MEX simple.


Remarque à propos de -largeArrayDims

L'option -largeArrayDims est un commutateur de la commande mex dans MATLAB qui indique simplement ne pas définirMX_COMPAT_32. Ainsi, dans Visual Studio, vous n'avez rien à faire car cela n'est pas défini par défaut. Si vous souhaitez le comportement opposé (-compatibleArrayDims), définissez MX_COMPAT_32 dans la section Préprocesseur.


Qu'est-ce que libut.lib?

J'inclus libut.lib, qui fournit quelques fonctions de Nice pour détecter une rupture (CTRL-C) à partir d'un fichier MEX. Les déclarations pertinentes (même si cela sort du sujet):

// prototype the break handling functions in libut (C library)
extern "C" bool utIsInterruptPending();
extern "C" void utSetInterruptPending(bool);
12
chappjc

Pour la construction/liaison/compilation, automatisez Visual Studio avec une extension ou une macro pour

  1. démarrer un client Matlab léger (à l'aide des options de ligne de commande -nojvm -noawt -nodesktop -nosplash, cela démarre en moins d'une seconde sur ma machine)
  2. générer le binaire en appelant mex (y compris les autres dépendances, etc.).
  3. si le débogage est activé, joignez le débogueur Visual Studio à votre client mince Matlab que vous venez de démarrer (tous les points de rupture sur lesquels vous cliquez dans VS seront actifs).

Je l'ai automatisé pour Visual Studio 2010. Ainsi, vous travaillez avec votre wrapper mex entièrement à partir de l'IDE Visual Studio, vous disposez de 4 boutons supplémentaires pour le débogage, etc. Les erreurs de compilation sont répercutées dans une fenêtre de terminal matlab plutôt que dans Visual Studio. Trouvez les macros téléchargées ici:

http://www.mathworks.se/matlabcentral/fileexchange/39549-visual-studio-toolbar-for-mex-interface-with-video-tutorial

1
Stefan Karlsson