环境: V7 32位
matlab: R2011b
visual studio 2010
目标:将matlab的文件生成c可以调用的文件。至于为什么要这么做呢?我的情况是 我目前有很多函数是用matlab编的,而我的C++工程又需要这些函数,要是重新用C++来写的话工程量太大,并且有些函数是MATLAB库函数中的,所以一个简单化的想法是将M文件生成C可以调用的文件。
步骤:
1、matlab命令窗口中 输入 mbuild -setup 安装编译器
Welcome to mbuild -setup. This utility will help you set up
a default compiler. For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2011b/win32.html
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:PROGRA~1MATLABR2011bsyslcc
[2] Microsoft Visual C++ 2010 in d:Program FilesMicrosoft Visual Studio 10.0
[0] None
Compiler: 2
Please verify your choices:
Compiler: Microsoft Visual C++ 2010
Location: d:Program FilesMicrosoft Visual Studio 10.0
Are these correct [y]/n? y
我是选的2,如果这里没有显示你的visual studio 那么你还要设置路径,自己再去查下怎么设置
确定y后,就安装完成了
2、mcc -W cpplib:lib**** -T link:lib****.m ***处为你的m文件名字。
然后就会生成一系列文件,我们有用的是
.dll .h .lib 这三个文件。这这三个文件放到你的工程下面
3.工程设置
3.1附加包含目录加入你的matlab安装路径下的extern include 比如:D:Program FilesMATLABR2011bexterninclude
3.2 链接器附加库目录 加入 lib D:Program FilesMATLABR2011bexternlibwin32microsoft
3.3 附加依赖项。要把刚生成的.lib 加入,还有其他的如下面圈出来的几个库也需要
然后就可以调试了,我在网上拷了个简单的程序
#include <iostream>
//#include "mclmcr.h" //这里不注释掉,则找不到mclInitializeApplication,原因是mclmcrrt.h这个头文件才是更新的头文件。
#include "mclmcrrt.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "libmysvd.h"
using namespace std;
int main()
{
if( ! mclInitializeApplication(NULL,0) )
{
fprintf(stderr, "Could not initialize the application.n");
exit(0);
}
if(!libmysvdInitialize()) //初始化,在libmysvd.h中
{
cout << "Could not initialize libmysvd!" <<endl;
exit(0);
}
double data[9]={1,2,3,4,5,6,7,8,9};
mwArray a(3,3,mxDOUBLE_CLASS,mxREAL);
a.SetData(data,9);
cout<<a<<endl<<endl; //显然,mwArry类对<<是有运算符重载的
mwArray s(3,3,mxDOUBLE_CLASS,mxREAL);
mwArray v(3,3,mxDOUBLE_CLASS,mxREAL);
mwArray d(3,3,mxDOUBLE_CLASS,mxREAL);
//mysvd(3,s,v,d,a); //调用自己用matlab写的函数,对a做奇异值分解
cout<<s<<endl<<endl;
cout<<v<<endl<<endl;
for (int i=1;i<4;i++) //逐个显示元素
{
for (int j=1;j<4;j++)
{
cout<<d.Get(i,j)<<" ";
}
cout<<endl;
}
cin.get();
return 0;
}
但是运行的时候会出现错误,
应该是程序方面的问题,再进行调试