Cómo compilar un programa MATLAB para generar una DLL
El siguiente es el código m utilizado en este ejemplo. Define una función llamada myadd2
función [y, z] = myadd2(a, b)
Función falsa, solo para demostrar la idea
y = a b;
z = a 2*b;
end
Copiar el código
El primer paso es compilar la función en una DLL con interfaz C, para la cual necesitamos configurar el compilador MATLAB. Para hacer esto, necesitamos configurar el compilador de MATLAB ejecutando "mbuild -setup" en la línea de comando de MATLAB. Luego use la siguiente línea de comando para compilar la función myadd2 en una DLL con una interfaz C:
mcc -W cpplib:libmyadd2 -T link:lib myadd2
Copiar código
El resultado es que obtendremos una DLL que contiene libmyadd2.dll, libmyadd2.C, libmyadd2.C, libmyadd2.DLL. dll, libmyadd2.ctf, libmyadd2.ctf, libmyadd2.h, libmyadd2.lib, etc. A continuación sólo necesitamos estos cuatro archivos.
Luego cree un proyecto VC de consola Win32 en VS2005 (para fines de prueba, lo llamé testmyadd2_r2007b) y copie los cuatro archivos anteriores al directorio de código fuente del proyecto VC.
A continuación, configure VC para que pueda encontrar la definición de la función de interfaz de MATLAB y conectarse a la función de biblioteca. Hay dos formas de hacer esto: una es cambiar la configuración VS2005 de VC, la ventaja de esto es que cada nuevo proyecto obtendrá automáticamente la configuración; la otra es cambiar solo la configuración del proyecto actual, lo que significa que el configuración Válido sólo para este proyecto. Aquí se utiliza el último método.
Abra el proyecto testmyadd2_r2007b en VS2005, seleccione el menú "Proyecto-->Propiedades" y agregue la ruta de inclusión proporcionada por MATLAB a la ruta de búsqueda del archivo de encabezado VC en el cuadro de diálogo.
Luego agregue los directorios lib apropiados a la ruta de búsqueda adicional del vinculador
A continuación, dígale a VC que nuestro programa necesita vincularse a dos bibliotecas adicionales: libmyadd2.lib y mclmcrrt.lib. Sepárelos con espacios
El último es el código del programa. Este programa tiene solo una función principal y su código completo se adjunta a continuación para su referencia.
#include "stdafx.h"
#include lt;iostreamgt;
#include "mclmcr.h"
#include "mclcppclass.h"
#include " libmyadd2.h"
int _tmain(int argc, _TCHAR* argv[])
{
std::cout lt;lt; "¡Hola mundo!" lt;lt; std::endl;
/* Inicializa el MCR */
if( !mclInitializeApplication (NULL, 0) )
{
std::cout lt; "No se puede inicializar la aplicación!" ; lt; "¡La aplicación no se puede inicializar!" lt; "La aplicación no se puede inicializar!" ; "¡La aplicación no se puede inicializar!" lt; "¡No se puede inicializar la aplicación!"
Devolución
// Inicializar lib
if( !libmyadd2Initialize())
{
std::cout lt;lt; "No se puede inicializar libmyadd2!"
return -1
}
prueba
{
// Declara e inicializa un
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
Copiar código
Contenido oculto de esta publicación
int i;
for( i=0; i lt; 4; i)
{
aData = 1.0*i;
}
//Imprimir salida
std::cout lt; "a = "lt;lt; std::endl;
std::cout lt.lt; aData[0] lt; ",\t" lt;lt; ;lt ; std::endl;
std::cout lt; aData[2] lt;lt; ",\t" lt; aData[3] lt; :endl ;
a.SetData(aData, 4);
//Declarar e inicializar b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1, 1) = 11.;
b(1, 2) = 12.
b(2, 1) = 21.;
p>b(2, 2) = 22.
mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray y(2, 2,
mxDOUBLE_CLASS);
// Llamar a la función
myadd2(2, y, z, a, b);
// Copiar los datos en mwArray a C Objeto
//Asignar salida
double *yData, *zData;
yData = new double[4];
Copiar código
if( yData == NULL )
{
std::cout lt; "¡Error al asignar memoria para yData!" std::endl;
Devuelve -1;
}
zData = nuevo doble[4]; = NULL )
{
std::cout lt; "¡Error al asignar memoria para zData! GetData(zData, 4);
// Salida de impresión
std::cout lt; "y = " lt; std:: endl
std:: cout lt; ;lt; ",\t" lt;lt; yData[1] lt;std::endl;
std::cout lt;lt; \t" lt;lt; yData[3] lt;lt; std::endl;
std:.cout lt;lt; "z = " lt;lt; std::endl; p>
std::endl;
p>std::cout lt;lt; zData[0] lt;lt; ",\t" lt;zData[1] lt; lt; std::endl;
std::cout lt;lt; zData[2] lt;lt; ",\t" lt;zData[3] lt; endl;
// desasignar memoria
eliminar [] aData;
eliminar [] zData <
eliminar [] yData;
}
catch( const mwExceptionamp; e)
{
std::cerr lt;lt e.what(); lt;lt; std::endl;
}
// Terminar lib
libmyadd2Terminate();
// Terminar MCR
mclTerminateApplication();
devuelve 0;
}