Matlab代碼轉C++(一)

    所用matlab版本爲:Matlab 2013a 32位  所用VS版本爲: VS2010  32位。 如果用64位matlab進行轉化,VS要用64位編輯器,否則,編輯時會出現”***無法解析***“的問題,因此建議用32的matlab進行轉化。

    轉化前的前期準備,見鏈接: http://blog.sina.com.cn/s/blog_67dd3b950101es47.html

一、轉化成exe文件:

1.安裝 MCRInstaller.exe

 MCRInstaller.exe 在安裝目錄  **\MATLAB\R2013a\toolbox\compiler\deploy\win32下,點擊直接安裝即可。
2.切換命令窗口地址
把matlab命令窗口地址,切換到要轉化的.m文件所在文件夾地址,這樣轉化生成的exe會和.m文件在同一文件夾中。
3.執行轉化命令
在matlab的命令窗口中輸入:mcc -m main ,即開始轉化。(main爲待轉化的.m文件名)
如果提示如下錯誤,就把mcc -m main 手動輸入一下:

到此,exe文件就生成了。

二、轉化成.dll、.lib、.h、.cpp文件

1.新建一個test.m文件,並保存:(以相加爲例)

  1. function [C] = test(A,B)  
  2. C = A+B;  
  3. end  
function [C] = test(A,B)
C = A+B;
end

2.切換命令窗口地址:

命令窗口地址切換到test.m所在文件夾地址。

3.執行轉化命令:

mcc -W cpplib:Mytest -T link:lib test.m

參數說明:  -W:       控制編譯後的封裝格式

                       cpplib:表示生成C++的lib,會生成.cpp文件  去掉cpp,會生成C的lib,生成.c文件;冒號之後,是生成的.dll、.lib、.h、.cpp的文件名

                       link:lib:表示連接到lib的目標

                       test.m :  待轉化的.m文件名

到此,即生成了.dll、.lib、.h、.cpp文件以及其他文件。

三、VS中調用test函數

在VS中調用test函數,只需要生成的.dll、.lib、.h文件,具體過程如下:

1.配置VS

<1>把matlab安裝目錄 ***\MATLAB\R2013a\extern 下的include文件夾,拷貝到工程目錄下

同時,在工程目錄下新建lib文件夾,並把***\MATLAB\R2013a\extern\lib\win32\microsoft 下的所有lib文件,拷貝到所建lib文件夾中。

* 把生成的.h文件,拷貝到include文件夾中,把.lib文件拷貝到lib文件夾中。

<2>在工程屬性頁的  配置屬性->VC++ 目錄->包含目錄 中,添加include文件夾路徑

       在工程屬性頁的  配置屬性->VC++目錄->庫目錄 中,添加lib文件夾路徑

       在工程屬性頁的  配置屬性->連接器->輸入 中輸入 mclmcrrt.lib 和 Mytest.lib。(mclmcrrt.lib爲matlab自身的lib文件,Mytest.lib爲matlab生成的lib文件)

<3>把生成的.dll文件拷貝到,工程目錄的Debug文件夾中。(新建VS工程,編輯後,會生成Debug文件夾)

2.編寫程序調用test函數

  1. #include "stdafx.h"  
  2. #include "engine.h"  
  3. #include "Mytest.h"  
  4.   
  5. using namespace std;  
  6. int main()  
  7. {  
  8.     int a = 4;  
  9.     int b = 3;  
  10.     int c;  
  11.     if(!MytestInitialize())  //初始化庫文件,在.h文件中有定義,Mytest爲生成文件名  
  12.     {    
  13.          cout<<lib Mytest Initialize failed!\n<<endl;  
  14.          return 0;    
  15.     }    
  16.   
  17.     mwArray mwa(1,1,mxUINT32_CLASS);  //給輸入參數A賦值  
  18.     mwa.SetData(&a,1);   
  19.   
  20.     mwArray mwb(1,1,mxUINT32_CLASS);  //給輸入參數B賦值  
  21.     mwb.SetData(&b,1);    
  22.   
  23.     mwArray mwy(1,1,mxUINT32_CLASS);   
  24.       
  25.     test(1,mwy,mwa,mwb);  //調用test函數,該函數在.h中有定義  
  26.                           //第一個參數:.m文件中test函數對應的輸出參數個數  
  27.                           //第二個參數:.m文件中test函數對應的輸出參數C  
  28.                           //第三個參數:.m文件中test函數對應的輸入參數A  
  29.                           //第四個參數:.m文件中test函數對應的輸入參數B  
  30.     mwy.GetData(&c,1);  //獲取test計算結果C  
  31.       
  32.     cout<<c<<endl;  
  33.     MytestTerminate(); //結束end 在.h中有定義  
  34.   
  35. }  
#include "stdafx.h"
#include "engine.h"
#include "Mytest.h"

using namespace std;
int main()
{
	int a = 4;
	int b = 3;
	int c;
	if(!MytestInitialize())  //初始化庫文件,在.h文件中有定義,Mytest爲生成文件名
	{  
		 cout<<lib Mytest Initialize failed!\n<<endl;
		 return 0;  
	}  

	mwArray mwa(1,1,mxUINT32_CLASS);  //給輸入參數A賦值
    mwa.SetData(&a,1); 

	mwArray mwb(1,1,mxUINT32_CLASS);  //給輸入參數B賦值
    mwb.SetData(&b,1);  

	mwArray mwy(1,1,mxUINT32_CLASS); 
	
	test(1,mwy,mwa,mwb);  //調用test函數,該函數在.h中有定義
	                      //第一個參數:.m文件中test函數對應的輸出參數個數
						  //第二個參數:.m文件中test函數對應的輸出參數C
						  //第三個參數:.m文件中test函數對應的輸入參數A
						  //第四個參數:.m文件中test函數對應的輸入參數B
	mwy.GetData(&c,1);  //獲取test計算結果C
	
	cout<<c<<endl;
	MytestTerminate(); //結束end 在.h中有定義

}


注:
     1.mwArray是一種C++和matlab結合的數據類型,生成的函數參數定義類型爲mwArray型,所以在VS中需要用mwArray參數,來調用test函數,生成的test函數定義如下:

      

  1. extern LIB_Mytest_CPP_API void MW_CALL_CONV test(int nargout, mwArray& C, const mwArray& A, const mwArray& B);  
extern LIB_Mytest_CPP_API void MW_CALL_CONV test(int nargout, mwArray& C, const mwArray& A, const mwArray& B);

    2.VS建工程時,選用了MFC頭文件,所以添加了stdafx.h頭文件,如果沒有用MFC頭文件,需去掉該頭文件。


                        

                    

發佈了10 篇原創文章 · 獲贊 94 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章