Red de conocimiento informático - Material del sitio web - Cómo compilar un programa MATLAB para generar una DLL

Cómo compilar un programa MATLAB para generar una DLL

Compile el código m simple en una DLL con una interfaz C y luego llámelo desde el programa C. Para simplificar, el programa C aquí es un programa de consola Win32 en lugar de un programa GUI de Windows, pero esto no obstaculiza la discusión.

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;

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;

}