所用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文件,並保存:(以相加爲例)
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函數
- #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中有定義
- }
#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函數定義如下:
- 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頭文件,需去掉該頭文件。