Matlab R2010a和vs 2010混合編程

MatlabR2010a與vs2010 c++混合編程成功,在vs2010 c++中能夠調用matlab的m函數,進行計算,得到正確結果,調用matlab中m函數轉化成的dll文件
一、matlab編譯環境的設置

mex –setup
Pleasechoose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? n
這個地方如果選擇y,那麼就看不到vs2010 c++的編譯器,只能看到C++6.0的(我電腦裏裝了這兩個),我之前寫的就是用C++6.0的編譯器編譯的DLL,再用VS2010可以調用成功的。如果這時候你想選擇vs2010 c++的編譯器,就要選擇n,我想也應該可以的。
mbuild –setup
同上
舉例:創建所需的Matlab函數文件 MyAdd.m
function [c] = MyAdd(a, b);
c = a + b;
然後,進行編譯,命令如下:
mcc -W cpplib:libMyAdd -T link:lib MyAdd.m–C
會生成如下文件:
libMyAdd.cpp(這裏有函數接口說明)
libMyAdd.dll
libMyAdd.h
libMyAdd.ctf
libMyAdd.lib
這四個是要用到的文件。
vs2010項目目錄設置(MFC):
第一步:添加生成的動態鏈接庫文件
把四個要要用到的文件,複製到vs工程目錄下
第二步:選擇項目->項目屬性。選擇C/C++->常規->附加包含目錄:D:\Program Files\MATLAB\MATLAB Compiler Runtime\v713\extern\include(選擇Matlab R2010a編譯器路徑,這樣可以在沒有安裝Matlab的機器上運行,但必須安裝Matlab的編譯器MCR)
把MATLAB提供的include路徑添加到VC++的頭文件搜路路徑。

第三步:連接器->常規->附加庫目錄:D:\Program Files\MATLAB\MATLABCompiler Runtime\v713\extern\lib\win32\microsoft(選擇Matlab R2010a編譯器路徑,這樣可以在沒有安裝Matlab的機器上運行,但必須安裝Matlab的編譯器)
添加MATLAB生成的響應的lib所在目錄加入。

第四步:連接器->輸入->附加依賴項:libMyAdd.lib;mclmcrrt.lib(中間必須是回車分開,回車以後自動生成“;“,不是空格鍵,也不是手動添加;這個,不然會出現找不到”libMyAdd.lib;mclmcrrt.lib“錯誤)

設置完成!
代碼裏要添加頭文件即可

include” libMyAdd.h”

如果編譯會有錯誤:“char16_t”: 重定義;不同的基類型“
只需要在” libMyAdd.h”中添加如下代碼即可:

ifdef _CHAR16T

define CHAR16_T

endif

程序代碼(僅供參考):
voidCFUNCTIONADDDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
if(!mclInitializeApplication(NULL, 0))
{
MessageBox(_T(“could not initializethe application”));
}
if(!addtwoInitialize())
{
MessageBox(_T(“could not initialiaeaddtwo”));
}
try
{
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData=new double[4];
int i;
for (i=0; i<4; i++)
{
aData=1.0*i;
}
a.SetData(aData, 4);
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1, 1)=11;
b(1, 2)=12;
b(2, 1)=21;
b(2, 2)=22;
mwArray y(2, 2, mxDOUBLE_CLASS);
addtwo(1, y, a, b);
double *yData;
yData=new double[4];
if(yData==NULL)
{
MessageBox(_T(“failed toallocate memory for y”));
}
y.GetData(yData, 4);
CString str;
str.Format(_T(“%f, %f, %f,%f”), yData[1], yData[2], yData[3], yData[4]);
MessageBox(str);
delete []aData;
delete []yData;
}
catch (const mwException &e)
{
CString str;
str=e.what();
MessageBox(str);
}
addtwoTerminate();
mclTerminateApplication();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章