在學習和應用中,會遇到許多用matlab寫的代碼,如果自己再重寫為其他的語言,將是一件費時費力的工作,我們可以將其編譯為dll文件或者轉換為c/c++代碼直接使用。在C++程序中調用Matlab程序有兩大類方法:第一種是調用Matlab引擎,第二種是將m文件打包成dll文件在C++語言環境下調用。第一種方法這里不講。
一、安裝matlab及環境配置
1.1安裝過程
此處省略。
1.2環境配置
在調用dll時,有時會出現各種缺失文件的錯誤,這有可能是環境變量沒有配置好的原因。在系統變量中需要配置matlab、MATLAB_JAVA環境變量,如果java虛擬機版本過低,還需要安裝和配置java的環境變量。
在系統屬性->高級->環境變量中找到系統變量
(1)添加“matlab”變量,值為matlab安裝路徑“C:\Program Files (x86)\MATLAB\R2011b”。
在Path變量里添加C:\Program Files (x86)\MATLAB\R2011b\bin\win32;

(2)添加“MATLAB_JAVA”變量,值為“C:\Program Files (x86)\Java\jre1.8.0_40”;

(3)如果java虛擬機版本過低,還需要安裝和配置java的環境變量。安裝java , 一般安裝為java 6.0 ;配置java環境變量 :JAVA_HOME=C:\Program Files (x86)\Java\jre1.8.0_40\bin 。將C:\Program Files (x86)\Java\jre1.8.0_40\bin加到系統變量的Path后面

二、編譯matlab源碼為c/c++代碼和dll文件
2.1在matlab中配置c++編譯器及編譯代碼
(1)在matlab控制台輸入“mex -setup”,選擇“y”,然后選擇你要編譯成c/c++代碼的編譯器,matlab有默認Lcc的c++編譯器。這里選擇vc++2010的編譯器。

(2)在matlab控制台輸入“mbuild-setup”,選擇“y”,然后選擇你要編譯成c/c++代碼的編譯器。

(3)編譯代碼
首先選擇matlab代碼的工作環境的目錄,然后在matlab控制台輸入編譯指令:
mcc -B cpplib:blindest blindest.m ascread.m smoothn.m ascwrite.m ascgrid.m
這里是編譯成dll文件和c++源碼。其中blindest是要編譯的目標的名字,blindest.m ascread.m smoothn.m ascwrite.m ascgrid.m是要編譯的源程序的名字。這些matlab源碼是matlab函數,函數名和文件名要一樣,同一個文件里的主函數可以調用同一個文件里的子函數,也可以調用其他文件里的函數。如下圖matlab代碼

這樣就生成了c++的源碼和dll文件。你需要用到*.dll,*.h,*.lib文件復制到你將要新建的c++項目下。

(4)其他編譯指令
指令:mcc -W lib:plotdata plotdata.m -T link:lib
指令:mcc -B csharedlib:plotdata plotdata.m
這兩條指令和上面是等效的,都是編譯成c++的dll文件。
指令:mcc -l blindest.m smoothn.m
這條指令是編譯為c的dll文件。
指令:mcc -m blindest.m smoothn.m
這條指令是編譯為c的可執行文件*.exe。
2.2新建vs項目
(1)新建vs2010的c++空項目或win32控制台項目,
將頭文件和庫文件還有dll文件添加到新建項目目錄下,在新建的項目cpp文件中添加以下代碼,用來調用dll文件。
1 #include "stdafx.h" 2 // include matlab sys head file 3 #include "mclmcr.h" 4 //#include "matrix.h" 5 //#include "mclcppclass.h" 6 7 // include lib head file 8 #include "blindest.h"// 9 10 // link matlab sys lib 11 //#pragma comment(lib, "mclmcrrt.lib") 12 //#pragma comment(lib, "libmx.lib") 13 //#pragma comment(lib, "libmat.lib") 14 #pragma comment(lib, "mclmcr.lib")
(2)配置項目庫文件

在包含目錄加入:C:\Program Files %28x86%29\MATLAB\R2011b\extern\include;
庫目錄加入:C:\Program Files %28x86%29\MATLAB\R2011b\extern\lib\win32\microsoft;
點擊連接器=>輸入,在附加依賴項中添加:
libeng.lib
libmx.lib
libmat.lib
mclmcr.lib
mclmcrrt.lib
blindest.lib
(3)寫調用代碼
在生成的*.h文件中,會有一個函數對應matlab代碼的函數
blindest(const mwArray& optflag, const mwArray& optArgs, const mwArray& sflag, const mwArray& count, const mwArray& sArgs, const mwArray& tcount);
在自己的代碼中可以直接調用這樣的函數,函數參數類型為mwArray,具體查閱相關資料,如果是編譯為c代碼,只有函數參數類型為mxArray的函數,c++兩者都有。
參考資料:
1.http://blog.chinaunix.net/uid-21372424-id-316767.html
2.http://blog.csdn.net/c4501srsy/article/details/8129616
3.http://www.cnblogs.com/kmliang/archive/2012/08/29/2662943.html
4.http://blog.sina.com.cn/s/blog_59fabe030102vifr.html
5.http://m.blog.csdn.net/blog/hong__fang/43307701
示例代碼:
// include matlab sys head file
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
// include lib head file
#include "libCaculateFun.h"
// link matlab sys lib
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "mclmcr.lib")
// link lib
#pragma comment(lib, "libCaculateFun.lib")
void TestDeno()
{
// init lib
if (!(libCaculateFunInitialize()))
{
std::cout<<"Could not init lib !"<<endl;
return -1;
}
double xxxx[2] = {0};
double inin = 0;
double yyyy[2] = {0};
double outo = 0;
// 為函數參數分配內存空間
mwArray mwXX(1, 2, mxDOUBLE_CLASS);
mwArray mwIn(1, 1, mxDOUBLE_CLASS);
mwArray mwYY(1, 2, mxDOUBLE_CLASS);
mwArray mwOut(1, 2, mxDOUBLE_CLASS);
// 為輸入參數賦值
mwXX.SetData(&xxxx, 2);
mwIn.SetData(&inin, 1);
// 調用計算函數
CaculateFun(2, mwYY, mwOut, mwXX, mwIn);
// 獲取輸出參數
outo = mwOut.Get(1, 1);
// lib Terminate
libCaculateFunTerminate();
// MCR Terminate
mclTerminateApplication();
}
三、參考資料
1.http://www.cnblogs.com/xpvincent/archive/2013/02/05/2893046.html
2.http://lunan.iteye.com/blog/1279124
3.http://www.cnblogs.com/lidabo/archive/2012/08/24/2654148.html
4.http://blog.csdn.net/zouxy09/article/details/20553007
5.http://blog.sina.com.cn/s/blog_9db9f81901013yv2.html
6.http://www.cnblogs.com/mfryf/archive/2012/02/16/2354161.html
7.http://cn.mathworks.com/help/matlab/matlab_prog/string-evaluation.html
