Matlab与VS混合编程总结

来源:互联网 发布:大牌眼镜知乎 编辑:程序博客网 时间:2024/06/10 03:26

Matlab与VS混合编程有很多种方法,本人采用了自己认为最简单的一种,即VS调用matlab生成的动态链接库。现在将整个过程总结如下,方便以后翻阅,同时也造福像我一样的菜鸟。


一、生成动态链接库


创建matlab函数文件,如:pca.m。用mcc编译pca。因为matlab可能有改动,建议先在matlab命令行


中输入:help mcc;查看帮助,将pca.m编译成c++的动态链接库,注意一定要选c++,选c的话,函数


名称会发生改变。


二、在VS中调用matlab动态链接库


1、在工程->属性->VC++目录:


在“包含文件”,添加目录:


<MATLAB>/extern/include/


在“库文件”,添加目录:


<MATLAB>/extern/lib/win32/microsoft(如果是64位的,添加win64)


2、将matlab用mcc命令生成的.h .lib 与.dll文件拷贝到工程下。


3、在需要用到matlab函数的文件中引入相关库,即加入代码:
#include "*.h"
#pragma comment(lib,"*.lib") //生成的.h与.lib


#pragma comment(lib,"mclmcrrt.lib")//matlab运行库中文件。


4、初始化库


在调用matlab的起始位置,应该对所有用到的库进行初始化,例如可以写一个专门的初始化函数:


//功能:初始化matlab库;
void InitMatlabLib()
{
// 初始化库;
//matlab系统库;
if( ! mclInitializeApplication(NULL,0) )
{
fprintf(stderr, "Could not initialize the application.\n");
exit(1);
}
//以下全部为自定义库;
if (!libmulInitialize() )
{
fprintf(stderr,"Could not initialize the library.\n");
exit(1);
}
if (!libpcaInitialize() )
{
fprintf(stderr,"Could not initialize the library.\n");
exit(1);
}
if (!libpcatInitialize() )
{
fprintf(stderr,"Could not initialize the library.\n");
exit(1);
}
}


5、在matlab调用全部结束后,应该关闭相关的matlab库,有实例如下:
//功能:关闭matlab相关库;
void DelMatlabLib()
{
// 关闭库和程序;
//关闭自定义库
libpcaTerminate() ;
libmulTerminate() ;
libpcatTerminate() ;
//关闭系统运行库
mclTerminateApplication() ;
}


参考资料:
http://www.cnblogs.com/lidabo/archive/2012/08/24/2654148.html


http://blog.csdn.net/hahalxp/article/details/5415257


三、发布含有matlab动态链接库的VS程序


首先,对工程的release版本进行打包。记住,是将VS生成的两个release文件夹下的所有文件打包。


另外,因为debug和release版本环境独立,所以,上面的matlab环境要在release情况下重新配置一


遍。VS打包过程详见:


http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html


其次,将用VS打包好的debug文件中的文件与matlab运行库一起,用rar定制安装程序。


运行库为 MCRInstaller.exe,可以在如下路径中找到: 


 /MATLAB/R2010b/toolbox/compiler/deploy/win32   


其中R2010b是版本号,你可以找自己所安装版本的相关路径。


用rar定制安装程序可参考:


http://www.myhack58.com/Article/48/65/2006/11820.htm


记住,setup.exe 与 MCRInstaller.exe都填写在解压后运行中。。