主要的实验任务是将,matlab编写的定标程序转换成可以独立运行的.exe文件和供vs2010调用的c++动态链接库。测试,经过转换过后能否提高程序的运行时间。
实验的操作环境:vs2010中文版,matlab2012a,win7,64位
环境的配置:
首先在matlab2012a中输入mbuild -setup,如下:
接着根据操作分别输入:y,1,y;最终结果如下:
到此为止,matlab里的编译器配置已经完成,本例中选择的是vs2010.需要注意的是:不是所有的matlab版本都可以调用任意的vs版本,matlab2010b以后的才可以调用vs2010.
接下来,如果,我们是要生成.exe程序,我们可以直接使用mcc –m完成操作,在matlab的busy结束后,我们可以在路径下看到生成的.exe程序。如果,我们需要将.m文件编译成供vs2010调用的动态链接库,我们需要用mcc -W将matlab编写的.m文件编译成c++语言。注意:在matlab中,mcc的编译只能够用于function函数。所以,我们在操作之前,要先将目标写成函数的.m文件形式。下面,我将以一个加法器的例子详细讲述操作的整个过程:
先编写function函数:
function [c]=add(a,b)
c=a+b;
return;
end
编译:
生成.exe文件
mcc -m add
在路径下会出现一下的图标:
其中add.exe就是我们需要的文件。直接运行它就可以了。本例是示范作用,运行时会提示有错误的,具体的可以使用写好的.m文件,编译好,就可以使用了。
生成供vs2010调用的动态链接库:
这里有两条指令:
mcc -W cpplib:add -T link:lib add
和
mcc -W lib:add -T link:lib add
第一条是编译生成c++动态链接库
第二条是编译生成c动态链接库
式中cpplib:add中的add是编译后文件的名称,link:lib 后的add是要编译的.m文件。
编译结束后,结果如下
其中.lib是动态链接库,.h是头文件,这两个文件加上.dll是我们在vs2010里需要使用的。
最新推出的matlab2013b由于编译器没有破解完全,操作时会出现一下的错误:
Error using mcc
Test checkout of feature 'Compiler' failed.
所以,我们尽量不要用matlab2013b来完成操作
在matlab里完成操作后,我们在来设置一下vs2010的环境,
在vs2010里新建win32控制台程序,选择无头文件,其他默认设置,进入解决方案后,在项目add点击右键,添加,新建项,选择c++文件(.cpp),文件名可以设置为main,接下来编写程序
#include<iostream>
#include”add.h”
using namespace std;
int main()
{
if(addInitialize())
{
cout<<"sucess!"<<endl;
}
else
{
cout<<"fail!"<<endl;
return(0);
}
mwArray a(2,3,mxDOUBLE_CLASS);
mwArray b(2,3,mxDOUBLE_CLASS);
mwArray c(2,3,mxDOUBLE_CLASS);
double x[]={1,2,3,4,5,6};
double y[]={7,8,9,10,11,12};
double *sum=new double[6];
a.SetData(x,6);
b.SetData(y,6);
add(1,c,a,b);
c.GetData(sum,6);
for (int i=0;i<2;i++)
{
for (int j=0;j<3;j++)
{
cout<<sum[j*2+i]<<" ";
}
cout<<endl;
}
cout<<"it is successful!!!"<<endl;
return(0);
}
在程序中添加的头文件
#include<iostream>
#include”add.h”
前者是输入、输出流头文件,后者是我们在matlab中生成的头文件。我们可以打开add.h,可以看到里面定义了我们需要的addInitialize()和addTermitate(),以及extern LIB_add_CPP_API void MW_CALL_CONV add(int nargout, mwArray& c, const mwArray& a, const mwArray& b);这三个都是我们在main函数中经常要用到的。mxArray是我们matlab矩阵与vs2010的数据接口。
注意:两个头文件,一个是〈〉另一个是“”,这个区别我暂时也不是很清楚,但是若使用#include”add.h”,会出现错误:
这些都完成以后,配置一下vs2010,解决方案资源管理器——(项目)add——右键——属性
点击 链接器——常规——附加库目录,添加
C:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft
E:\matlab与vc的混合编程\add\add
前面一个是matlab自己的动态链接库,后面一个是自己的路径;对于32位机,我们第一项可以改为C:\Program Files\MATLAB\R2012a\extern\lib\win32\microsoft
在链接器——输入——附加依赖项,添加
add.lib
mclmcrrt.lib
mclmcr.lib
其中第一项是我们自己生成的,后面两者是matlab自带的,我们在add中其实用到了。
我们使用的是64位机,我们需要打开配置管理器,点击新建,
在第一个下拉框中选择x64
32位机可以默认设置。接下来就是编译,我们按下F5,或者点击运行图标,出现了下面的错误:
“¡ãadd.exe”¡À: 已°?加¨®载?“¡ãC:\Program Files\MATLAB\R2012a\bin\win64\libmwrookfastbp.dll”¡À,ê?Cannot find or open the PDB file
“¡ãadd.exe”¡À: 已°?加¨®载?“¡ãC:\Program Files\MATLAB\R2012a\bin\win64\libmwspqr.dll”¡À,ê?Cannot find or open the PDB file
程¨¬序¨°“¡ã[2452] add.exe: 本À?机¨²”¡À已°?退ª?出?,ê?返¤¦Ì回?值¦Ì为a 0 (0x0)。¡ê
原来我们应该是要按下crtl+F5就可以了,或者这个键
这个键在原来的工具框中式没有的,我们可以把鼠标按到图示
点击以后,选择自定义,出现
选择工具栏中的生成菜单——添加命令——类别中选择调试——选择开始执行(不调试)
在确定,就可以了,在工具栏中就会出现 运行的程序 图标了。运行的结果:至此,add就结束
最后,我们在工作的过程中发现,直接运行时,会出现,matlab的figure图一闪而过,这个时候。这是由于,程序运行一次,就没有了,我们需要在程序中添加system(“pause”)或者在return 0 前加getch(),这两种情况下要在头文件中加入#include<stdlib.h>。