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都填写在解压后运行中。。