天天看点

Matlab与VS混合编程总结

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

继续阅读