首页 > 代码库 > C++调用Matlab DLL应用

C++调用Matlab DLL应用

最近在搞组里项目,需要用到C++调用Matlab的DLL,在网上查阅了一些资料终于取得一些成果,先总结如下:

首先,对Matlab的m文件进行编译生成C++的DLL与Lib文件。我用到的编译环境为Win7、Matlab2013a、Visual Stdio 2012.

1.设置Matlab的编译器

mex -setup


选着Y


选着1


完成mex编译器的设置

同样需要对mbuild进行配置

mbuid -setup

同样的选项

输入命令deploytool或选择

Matlab Compiler


弹出如下对话框


Type选择C++ Shared Library,点击ok选择添加已经编译好的m文件,点击编译即可


将distrib文件夹下的对应的dll、lib、h文件拷贝到自己的工程目录下。


在对C++工程进行配置的时候,首先要对计算机的环境变量进行配置,将Matlab的bin路径加载到环境变量中

我的电脑为D:\Program Files\MATLAB\R2013a\extern\lib\win64\microsoft;与D:\Program Files\MATLAB\R2013a\bin\win64,添加到用户路径与系统路径


然后对C++工程进行配置,需要包含目录路径与库目录

包含目录为:D:\Program Files\MATLAB\R2013a\extern\include与D:\Program Files\MATLAB\R2013a\extern\include\win64

库目录为:D:\Program Files\MATLAB\R2013a\extern\lib\win32\microsoft与D:\Program Files\MATLAB\R2013a\extern\lib\win64\microsoft


链接器->输入->附加依赖项:test.lib、mclmcrrt.lib、mclmcr.lib、libmx.lib、libmat.lib


完成以上配置即可对Matlab的Dll进行调用

需要注意的时Matlab编译生成的Dll中参数与m文件的参数会有所变化,如果函数有输出参数,那么编译以后该函数的第一个参数为输出参数的个数,后边依次为每个输出参数,然后为输入参数。同时需要注意的是Matlab生成的Dll中的函数只有mwArray一种数据类型,需要将C++中的数据类型转换为该类型。



如C++中有变量 int  a=1;

转换到Matlab中的函数需要定义为 mwArray mw_a(1, 1, mxINT32_CLASS);

因为Matlab只有矩阵类型的变量,所以需要这样定义,1, 1为a的列数与行数,这里需要特别注意,如果传入到Matlab函数的变量内部运算的话一定要保证变量的类型一致否则会出现Error using==> times Integers only can be combined integers……,出现这个错误就是因为不同类型的两个变量做了运算,所以一定要检查好m文件中每个变量的类型是否一致,以及C++中传入都Matlab函数中的变量类型是否与Matlab的函数所需类型一致,否则就会出现错误!


为了处理Maltab函数的异常可以利用try……catch来接受Matlab函数传回的异常

如:

try
{
     myfitline( x,y,m,xrange,t );//该函数为Matlab中定义的函数
}
catch(const mwException &ex)
{
     CString m_str;
     m_str = ex.what();
     MessageBox(m_str);
     return;
}


这样就完成了对Matlab的Dll的调用工作



注意:我的工程为64位的,32位的工程未做测试!



C++调用Matlab DLL应用