在學習和應用中,會遇到許多用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