1. 程式人生 > >Matlab與VS混合程式設計總結

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都填寫在解壓後執行中。。