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