在学习和应用中,会遇到许多用matlab写的代码,如果自己再重写为其他的语言,将是一件费时费力的工作,我们可以将其编译为dll文件或者转换为c/c++代码直接使用。在C++程序中调用Matlab程序有两大类方法:第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C++语言环境下调用。第一种方法这里不讲。
一、安装matlab及环境配置
1.1安装过程
此处省略。
1.2环境配置
在调用dll时,有时会出现各种缺失文件的错误,这有可能是环境变量没有配置好的原因。在系统变量中需要配置matlab、MATLAB_JAVA环境变量,如果java虚拟机版本过低,还需要安装和配置java的环境变量。
在系统属性->高级->环境变量中找到系统变量
(1)添加“matlab”变量,值为matlab安装路径“C:\Program Files (x86)\MATLAB\R2011b”。
在Path变量里添加C:\Program Files (x86)\MATLAB\R2011b\bin\win32;
(2)添加“MATLAB_JAVA”变量,值为“C:\Program Files (x86)\Java\jre1.8.0_40”;
(3)如果java虚拟机版本过低,还需要安装和配置java的环境变量。安装java , 一般安装为java 6.0 ;配置java环境变量 :JAVA_HOME=C:\Program Files (x86)\Java\jre1.8.0_40\bin 。将C:\Program Files (x86)\Java\jre1.8.0_40\bin加到系统变量的Path后面
二、编译matlab源码为c/c++代码和dll文件
2.1在matlab中配置c++编译器及编译代码
(1)在matlab控制台输入“mex -setup”,选择“y”,然后选择你要编译成c/c++代码的编译器,matlab有默认Lcc的c++编译器。这里选择vc++2010的编译器。
(2)在matlab控制台输入“mbuild-setup”,选择“y”,然后选择你要编译成c/c++代码的编译器。
(3)编译代码
首先选择matlab代码的工作环境的目录,然后在matlab控制台输入编译指令:
mcc -B cpplib:blindest blindest.m ascread.m smoothn.m ascwrite.m ascgrid.m
这里是编译成dll文件和c++源码。其中blindest是要编译的目标的名字,blindest.m ascread.m smoothn.m ascwrite.m ascgrid.m是要编译的源程序的名字。这些matlab源码是matlab函数,函数名和文件名要一样,同一个文件里的主函数可以调用同一个文件里的子函数,也可以调用其他文件里的函数。如下图matlab代码
这样就生成了c++的源码和dll文件。你需要用到*.dll,*.h,*.lib文件复制到你将要新建的c++项目下。
(4)其他编译指令
指令:mcc -W lib:plotdata plotdata.m -T link:lib
指令:mcc -B csharedlib:plotdata plotdata.m
这两条指令和上面是等效的,都是编译成c++的dll文件。
指令:mcc -l blindest.m smoothn.m
这条指令是编译为c的dll文件。
指令:mcc -m blindest.m smoothn.m
这条指令是编译为c的可执行文件*.exe。
2.2新建vs项目
(1)新建vs2010的c++空项目或win32控制台项目,
将头文件和库文件还有dll文件添加到新建项目目录下,在新建的项目cpp文件中添加以下代码,用来调用dll文件。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include "stdafx.h" 2 // include matlab sys head file 3 #include "mclmcr.h" 4 //#include "matrix.h" 5 //#include "mclcppclass.h" 6 7 // include lib head file 8 #include "blindest.h"// 9 10 // link matlab sys lib 11 //#pragma comment(lib, "mclmcrrt.lib") 12 //#pragma comment(lib, "libmx.lib") 13 //#pragma comment(lib, "libmat.lib") 14 #pragma comment(lib, "mclmcr.lib")
(2)配置项目库文件
在包含目录加入:C:\Program Files %28x86%29\MATLAB\R2011b\extern\include;
库目录加入:C:\Program Files %28x86%29\MATLAB\R2011b\extern\lib\win32\microsoft;
点击连接器=>输入,在附加依赖项中添加:
libeng.lib
libmx.lib
libmat.lib
mclmcr.lib
mclmcrrt.lib
blindest.lib
(3)写调用代码
在生成的*.h文件中,会有一个函数对应matlab代码的函数
blindest(const mwArray& optflag, const mwArray& optArgs, const mwArray& sflag, const mwArray& count, const mwArray& sArgs, const mwArray& tcount);
在自己的代码中可以直接调用这样的函数,函数参数类型为mwArray,具体查阅相关资料,如果是编译为c代码,只有函数参数类型为mxArray的函数,c++两者都有。
参考资料:
1.http://blog.chinaunix.net/uid-21372424-id-316767.html
2.http://blog.csdn.net/c4501srsy/article/details/8129616
3.http://www.cnblogs.com/kmliang/archive/2012/08/29/2662943.html
4.http://blog.sina.com.cn/s/blog_59fabe030102vifr.html
5.http://m.blog.csdn.net/blog/hong__fang/43307701
示例代码:
// include matlab sys head file
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
// include lib head file
#include "libCaculateFun.h"
// link matlab sys lib
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "mclmcr.lib")
// link lib
#pragma comment(lib, "libCaculateFun.lib")
void TestDeno()
{
// init lib
if (!(libCaculateFunInitialize()))
{
std::cout<<"Could not init lib !"<<endl;
return -1;
}
double xxxx[2] = {0};
double inin = 0;
double yyyy[2] = {0};
double outo = 0;
// 为函数参数分配内存空间
mwArray mwXX(1, 2, mxDOUBLE_CLASS);
mwArray mwIn(1, 1, mxDOUBLE_CLASS);
mwArray mwYY(1, 2, mxDOUBLE_CLASS);
mwArray mwOut(1, 2, mxDOUBLE_CLASS);
// 为输入参数赋值
mwXX.SetData(&xxxx, 2);
mwIn.SetData(&inin, 1);
// 调用计算函数
CaculateFun(2, mwYY, mwOut, mwXX, mwIn);
// 获取输出参数
outo = mwOut.Get(1, 1);
// lib Terminate
libCaculateFunTerminate();
// MCR Terminate
mclTerminateApplication();
}
三、参考资料
1.http://www.cnblogs.com/xpvincent/archive/2013/02/05/2893046.html
2.http://lunan.iteye.com/blog/1279124
3.http://www.cnblogs.com/lidabo/archive/2012/08/24/2654148.html
4.http://blog.csdn.net/zouxy09/article/details/20553007
5.http://blog.sina.com.cn/s/blog_9db9f81901013yv2.html
6.http://www.cnblogs.com/mfryf/archive/2012/02/16/2354161.html
7.http://cn.mathworks.com/help/matlab/matlab_prog/string-evaluation.html