Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo utilizar el código matlab para encapsular algoritmos matlab y crear una biblioteca de enlaces dinámicos independiente

Cómo utilizar el código matlab para encapsular algoritmos matlab y crear una biblioteca de enlaces dinámicos independiente

1. Establecer las variables de entorno del sistema operativo.

Agregue D:R2011abinwin32;D:R2011abin y E:Microsoft Visual Studio 10.0VCbin a las variables del sistema. Esta es la ruta del directorio de instalación de matlab y VS en mi máquina.

Después de configurar las variables del sistema, debes reiniciar tu computadora para que surtan efecto.

2. Configure el entorno de compilación de matlab

Ingrese el comando mex -setup en matlab, seleccione Microsoft Visual C++ 2010

Luego ingrese el comando mbuild - configuración, lo mismo Seleccione Microsoft Visual C++ 2010p.s. En este paso, durante mi propia configuración, matlab puede identificar fácilmente los compiladores instalados en la máquina y sus rutas de instalación, incluido VS2010, y seleccionarlos. En algunos entornos, es posible que matlab no siempre reconozca el compilador VC en VS2010 y no está claro cómo resolver este problema.

3. Matlab compila el archivo .m

Entrada mcc -W cpplib:yourfunLib -T link:lib yourfun.m

Entre ellos, yourfunLib es el DLL generada, el nombre del prefijo de Lib, es decir, puede ser la última DLL utilizada y el nombre de la biblioteca Lib yourfun es el nombre de la DLL que estás utilizando. name;yourfun es la función .m que necesita compilar.

Una vez completada la compilación, obtendrá algunos archivos en la siguiente imagen:

Los archivos con los sufijos DLL, LIB y H son útiles para llamadas VS, mientras que otros archivos son temporales. no disponible. (Aquí especifico yourfunLib como aetherLib)

4. Configuración de VS2010

Cree un nuevo proyecto de consola.

Abra la página de propiedades del proyecto y realice las siguientes configuraciones para el proyecto:

1. Agregue el directorio de inclusión en el directorio VC++

D:R2011aexterninclude. (Ruta del directorio de instalación de Matlab)

D:R2011aexternincludewin32? (Ruta del directorio de instalación de Matlab, la misma a continuación)

C:UserslenovoDesktopaetheraether (la ruta en su nuevo proyecto, la misma a continuación) )

2. Agregue el directorio de la biblioteca en el directorio VC++

D:R2011abinwin32

D.R2011aexternlib

C:UserslenovoDesktopaetheraether

p>

D:R2011aexternlibwin64microsoft

D:R2011aexternlibwin32lcc

D:R2011aexternlibwin32microsoft

3. Agregar directorios de inclusión adicionales en general en c/c++

D :R2011aexterninclude

4. Agregue directorios de biblioteca adicionales en General bajo el conector

D:R2011aexternlibwin64microsoft

D:R2011aexternlibwin64microsoft

5.

R2011aexternlibwin32microsoft

5. Agregue otras dependencias en la entrada debajo del conector

libeng.lib

libmat.lib

libmex.lib <. /p>

libmx.lib

mclmcrrt.lib

mclmcr.lib

aetherLib.lib (esta es la biblioteca generada por matlab, antes de One es la biblioteca en el motor de cálculo propio de matlab)

Agregue archivos a los archivos de encabezado y archivos de recursos en la administración de recursos de la solución

1. Agregue el archivo .h generado al archivo de encabezado

2. Agregue los archivos .lib y .dll al archivo de recursos

3 Luego copie los archivos .h, .lib y .dll al directorio del proyecto recién creado. . Por ejemplo, los puse en C:UserslenovoDesktopaetheraether.

Escribir código para llamar funciones en el dll

Las interfaces para las funciones en el dll se encuentran al final del archivo .h, para que pueda buscar estas interfaces. Los parámetros de entrada y salida de la función aquí deben ser referencias constantes al objeto mwArray. Se solicita a los lectores que busquen información relevante en Internet. Lo que debe comprender es que mwArray es una clase diseñada por matlab específicamente para "C++ llamando a dlls generados por matlab". Dado que incluye estas clases en el directorio de instalación de matlab, puede usarlas en VS.

El siguiente es un ejemplo de cómo escribir la función principal:

// newdll.cpp: define el punto de entrada de la aplicación de consola.

//

#include "stdafx.h"

#include

#include "motor.h"

#include "mclmcr.h"

#include "mclcppclass.h"

#include "libMyAdd.h"

usando espacio de nombres std;

int _tmain(int argc, _TCHAR* argv[])

{ if(!libMyAddInitialize())

{

/inicialización fallida!!! " <

return -1;

} doble a = 6 ;

doble b = 9;

doble c;

mwArray mwA(1, 1, mxDOUBLE_CLASS);

mwArray mwB( 1, 1, mxDOUBLE_CLASS);

mwArray mwC(1, 1, mxDOUBLE_CLASS);

mwA.SetData(&a, 1);

mwB.SetData (&b, 1).

MyAdd(1, mwC, mwA, mwB);

c = mwC.Get(1,1);

cout <

system("PAUSE"); return 0;

}

La función en este dll solo implementa dos números. Además de , que también es la función que uso para mi configuración básica.

#include "engine.h"

#include "mclmcr.h"

#include "mclcppclass.h"

#include "libMyAdd.h" estos Se deben incluir los archivos de encabezado y el motor parece estar incluido también. Todos los archivos DLL en el motor de cálculo Matlab (aún no revisados ​​cuidadosamente)

Ahora, con un poco de suerte, deberías ver el resultado esperado. Si hay un problema, como una ruta no encontrada, inaccesible, etc., usted deberá resolver el problema usted mismo. He estado investigando durante 3 días y obtengo todos los errores anteriores. Puede intentar buscar en otros blogs en Baidu, o es mejor buscar preguntas relacionadas en inglés en Google. Es posible que algunas comunidades tengan respuestas. No leí la documentación del moderador de Matlab, ¡pero puede ser muy útil!

Observaciones:

1. El problema que encontré cuando trabajaba por mi cuenta fue que la función .m en sí usaba una dll escrita en C++ y luego encapsuló la función .m. En este caso, debe asegurarse de que VS tenga acceso a los archivos DLL que está utilizando y que están escritos en C++, pero siempre que compile las funciones .m usando el comando mcc, solo necesita agregar el .m en las dependencias adicionales. ingresado debajo del conector Funciones DLL generadas sin agregar la DLL generada por esos códigos C++. Aquí se recomienda copiar el proyecto matlab al proyecto VS y luego trabajar directamente en el proyecto VS. Se recomienda copiar el proyecto matlab al proyecto VS y luego compilar MCC directamente en el proyecto VS. 2. Requiere if(!libMyAddInitialize()) en el código de la función principal. 3.