matlab - ¿Cómo construir un archivo mex directamente en Visual Studio?
visual-studio (3)
Tengo una solución de Visual Studio 2010 que contiene una biblioteca de funciones, y me gustaría poder usar MATLAB como uno de los varios posibles frentes de esta biblioteca. Por lo tanto, me gustaría que Visual Studio genere automáticamente un archivo mex cuando compile la solución, sin tener que exportar todas mis opciones de compilación y rutas a mexopts.bat y abrir MATLAB para compilar el archivo desde allí. He visto varias sugerencias para lograr algo similar, por ejemplo en estas publicaciones:
Matlab 7.1+ y Visual Studio 2005
Compilando un archivo MEX con Visual Studio
Sin embargo, o bien parecen un poco desactualizados (haciendo referencias a archivos que ya no se encuentran) o hacen uso de herramientas externas (por ejemplo, CMake). ¿Alguien sabe cómo configurar un nuevo proyecto (dentro de la solución existente) en Visual Studio (2010 y más reciente) que construirá un archivo mex para las versiones contemporáneas de MATLAB?
Después de experimentar con la guía de esta página mencionada en la pregunta, parece que al comenzar con un proyecto de C ++ vacío, las siguientes configuraciones en las Páginas de propiedades del proyecto son necesarias y suficientes para crear un .mexw64 funcional desde Visual Studio 2010:
Configuration properties -> General: Set Target Extension to .mexw64 Set Configuration Type to Dynamic Library (.dll) Configureation poperties -> VC++ Directories: Add $(MATLAB_ROOT)/extern/include; to Include Directories Configuration properties -> Linker -> General: Add $(MATLAB_ROOT)/extern/lib/win64/microsoft; to Additional Library Directories Configuration properties -> Linker -> Input: Add libmx.lib;libmex.lib;libmat.lib; to Additional Dependencies Configuration properties -> Linker -> Command Line: Add /export:mexFunction to Additional Options
$(MATLAB_ROOT)
es la ruta a la carpeta raíz de Matlab, por ejemplo. C: / Archivos de programa / MATLAB / R2013a.
Hasta ahora, esto solo se ha intentado desde una solución creada desde cero y construida para Matlab 2013a de 64 bits. Supongo que para compilar para 32 bits solo se necesita cambiar ambas apariciones de 64 a 32. Actualizaré la publicación cuando haya confirmado que esto funciona para una solución existente.
EDITAR: Como se esperaba, esto funciona para proyectos agregados a soluciones existentes. Recuerde configurar el nuevo proyecto para que dependa del proyecto que crea la biblioteca.
Edición 2: siguiendo esta pregunta , puedo confirmar que los pasos anteriores funcionan también en Visual Studio 2012, 2013 y 2017.
Para crear / enlazar / compilar, automatice Visual Studio con una extensión o macro para
- iniciar un cliente ligero de Matlab (usando las opciones de la línea de comando -nojvm -noawt -nodesktop -nosplash, esto comienza en menos de un segundo en mi máquina)
- genere el binario llamando a mex (incluyendo las otras dependencias, etc.).
- si la depuración está activada, adjunte el depurador de Visual Studio a su cliente de thin matlab recién iniciado (todos los puntos de ruptura en los que haga clic en VS estarán activos).
He automatizado esto para visual studio 2010. De esta manera, trabajas con tu mex-wrapper completamente desde el IDE de Visual Studio, tienes 4 botones adicionales para depurar, etc. Los errores de compilación se repiten desde una ventana de terminal de Matlab en lugar de dentro de Visual Studio. Encuentra las macros subidas aquí:
Configuración rápida de proyectos de Visual Studio para archivos MEX con una hoja de propiedades
Todas las configuraciones se pueden aplicar a través de hojas de propiedades , un mecanismo para aplicar rápidamente las configuraciones de proyectos de Visual Studio.
Pasos:
- Descargue la hoja de propiedades (MATLAB.props) de este repositorio de GitHib . Es corto y dulce. Realmente te insto a que hagas el tuyo para aprender qué hay involucrado en el proceso. Consulte la sección Detalles de la hoja de propiedades a continuación para obtener una descripción.
- Establezca las variables de entorno raíz de MATLAB:
MATLAB_ROOT
para su instalación de MATLAB de 64 bits yMATLAB32_ROOT
para cualquier instalación de MATLAB de 32 bits (por ejemplo,C:/Program Files/MATLAB/R2014b/
). Esta carpeta tiene los subdirectorios bin, extern, sys, etc. Reinicie VS si está abierto. - Cree un proyecto DLL vacío en Visual Studio, opcionalmente creando una plataforma de solución x64. Haga esto seleccionando "Proyecto Win32" y seleccionando DLL de la siguiente manera:
- En "Administrador de propiedades" (seleccione en el menú Ver), para la configuración de construcción de cada proyecto, haga clic con el botón derecho y elija "Agregar hoja de propiedades existentes ..." , y seleccione la hoja de propiedades apropiada (32 o 64 bits). (Ver captura de pantalla abajo)
¡Eso es!
Solo recuerde que cuando vaya entre MATLAB para usar su archivo MEX y Visual Studio para construir una nueva versión, será necesario ejecutar un clear mex
clear specificMEXFileName
o un clear mex
clear specificMEXFileName
para poder sobrescribirlo. Construyo casi todos mis archivos MEX de esta manera.
ACTUALIZACIÓN (22/05/15) : el archivo MATLAB.props ahora es compatible con Parallel Computing Toolbox para usar los objetos mxGPUArray
. Si la ruta de la caja de herramientas y la biblioteca (gpu.lib) existen en su máquina, pueden usarse. Simplemente incluya el CUDA SDK "Build Customization" (que debería instalarse si ha instalado CUDA SDK e instalado las integraciones de Visual Studio) para incluir cuda_runtime.h, etc. Finalmente, enlace con cudart_static.lib (pero mantenga Heredado .. . revisado o obtendrá otros errores del enlazador).
Detalles de la hoja de propiedades
Hay solo algunas configuraciones importantes en la hoja de propiedades:
- Agregando
$(MATLAB_ROOT)/extern/include
a las rutas deAdditionalIncludeDirectories
(con rutas heredadas de las configuraciones principales) - la ubicación de mex.h. - Agregando
$(MATLAB_ROOT)/extern/lib/win64/microsoft
a las rutasAdditionalLibraryDirectories
- la ubicación de libmex.lib, etc. - Listado de las bibliotecas:
libut.lib;libmx.lib;libmex.lib;libmat.lib
. - Exportando
mexFunction
(es una biblioteca compartida):/EXPORT:mexFunction
. - Configuración de la extensión del archivo de salida (por ejemplo,
.mexw64
para x64).
No es necesario , pero también especifica un manifiesto de salida que NO está incrustado en la biblioteca, establece MATLAB_MEX_FILE
y activa la generación de datos necesarios para la creación de perfiles.
Para completar, tenga en cuenta que existe un sistema más formal de " configuración de compilación " para la configuración del proyecto, que incluye una hoja de propiedades, pero una hoja de propiedades suelta es suficiente para configurar un proyecto MEX simple.
Una nota sobre -largeArrayDims
La opción -largeArrayDims
es un cambio al comando mex
en MATLAB que simplemente indica que no se debe definir MX_COMPAT_32
. Entonces, en Visual Studio, no tiene que hacer nada ya que esto no está definido de forma predeterminada. Si desea el comportamiento opuesto ( -compatibleArrayDims
), defina MX_COMPAT_32
en la sección Preprocesador.
¿Para qué sirve libut.lib?
Incluyo libut.lib, que proporciona algunas funciones interesantes para detectar una ruptura (CTRL-C) desde un archivo MEX. Las declaraciones relevantes (aunque esto está saliendo del tema):
// prototype the break handling functions in libut (C library)
extern "C" bool utIsInterruptPending();
extern "C" void utSetInterruptPending(bool);