首页 > 代码库 > 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应用