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
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?
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.
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:
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.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:
$(MATLAB_ROOT)\extern\include
aux chemins AdditionalIncludeDirectories
(avec les chemins hérités des configurations parent) - l'emplacement de mex.h.$(MATLAB_ROOT)\extern\lib\win64\Microsoft
aux chemins AdditionalLibraryDirectories
- l'emplacement de libmex.lib, etc.libut.lib;libmx.lib;libmex.lib;libmat.lib
.mexFunction
(c'est une bibliothèque partagée): /EXPORT:mexFunction
..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);
Pour la construction/liaison/compilation, automatisez Visual Studio avec une extension ou une macro pour
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: