matlab生成dll

2017-01-17  by:CAE仿真在線  來(lái)源:互聯(lián)網(wǎng)

實(shí)驗(yàn)室的一個(gè)項(xiàng)目需要調(diào)用matlab程序。經(jīng)過(guò)再三考慮,決定使用vc調(diào)用matlab導(dǎo)出庫(kù)的形式。而我主要負(fù)責(zé)與matlab程序結(jié)合的工作。以下是今天工作的簡(jiǎn)要總結(jié)。全當(dāng)是個(gè)備忘吧。

1:在matlab中選擇compiler。

在命令行窗口輸入:mex -setup

按照提示選擇vc6.0.由于使用的是matlab7,不識(shí)別vs2010和2008,無(wú)奈有裝的vc6.0。但聽說(shuō)最新版的matlab可以識(shí)別。

2:選擇builder.

輸入:mbuild -setup

同樣選擇vc6.0

3:生成dll。

輸入:mcc -W cpplib:mydll -T link:lib test.m


眾所周知Matlab的強(qiáng)大運(yùn)算能力讓各種工程軟件望而卻步,而VC程序的友好界面又讓人愛(ài)不釋手,如果能夠讓兩者的優(yōu)勢(shì)結(jié)合起來(lái)的話,勢(shì)必能讓程序員歡欣鼓舞。還好MathWorks已經(jīng)為我們想到了,基本上現(xiàn)在市面上主流的Matlab版本都可以支持VC和Matlab的混合編程。但是目前網(wǎng)上資料基本上都是基于Matlab 6.0和VC 6.0的,和新版本的實(shí)現(xiàn)方法有所不同,因此筆者通過(guò)不斷的嘗試和研究,終于調(diào)試通了基于VS2008和Matlab R2010b的混合編程。

為了更加直觀的說(shuō)明如何實(shí)現(xiàn)混合編程,筆者寫了一個(gè)簡(jiǎn)單的程序作為測(cè)試。先在Matlab里面寫一個(gè)M文件,代碼如下:

function b = MyFunc(a)

b = a.*a;

將M文件保存為MyFunc.m,保存在F:/test文件夾中。然后在Matlab主窗口中將當(dāng)前文件夾改為F:/test:

cd F:/test;

為了能夠讓VC調(diào)用Matlab程序,我們可以采用將Matlab程序包裝成動(dòng)態(tài)鏈接文件DLL的形式,然后讓VC調(diào)用動(dòng)態(tài)鏈接文件,因此在Matlab中,我們需要設(shè)置一下Matlab的編譯庫(kù),在Matlab主窗口中鍵入如下代碼:

mbuild –setup

然后出現(xiàn)

Please choose your compiler for buildingstandalone MATLAB applications:

Would you like mbuild to locate installedcompilers [y]/n?

鍵入y后回車,出現(xiàn)

Select a compiler:

[1] Lcc-win32 C 2.4.1 inD:\PROGRA~1\MATLAB\R2010b\sys\lcc

[2] Microsoft Visual C++ 2008 SP1 inD:\Program Files\Microsoft Visual Studio 9.0


[0] None


Compiler:

由于我們是需要用VC來(lái)調(diào)用Matlab函數(shù),因此我們選擇2,回車,出現(xiàn)

Please verify your choices:


Compiler: Microsoft Visual C++ 2008 SP1

Location: D:\Program Files\Microsoft VisualStudio 9.0


Are these correct [y]/n?

確定,鍵入y后回車,出現(xiàn)


****************************************************************************

Warning: Applications/components generated using Microsoft VisualStudio

2008 require that the Microsoft Visual Studio 2008 run-time

libraries be available on the computer used for deployment.

To redistribute your applications/components, be sure that the

deployment machine has these run-time libraries.


****************************************************************************

Trying to update options file: C:\Users\張智宇\AppData\Roaming\MathWorks\MATLAB\R2010b\compopts.bat

From template: D:\PROGRA~1\MATLAB\R2010b\bin\win32\mbuildopts\msvc90compp.bat


Done . . .

如果出現(xiàn)以上說(shuō)明,則證明Matlab編譯器設(shè)置成功了。接下來(lái)是生成M文件的DLL文件。

在Matlab主窗口中鍵入如下代碼

mcc –W cpplib:MyDLL –T link:lib MyFunc.m –C

其中cpplib:后面的是需要生成文件的文件名,是自己取的,link:lib后面的MyFunc.m是轉(zhuǎn)換為DLL的M文件的文件名。 -W/-T/-C是參數(shù),具體含義可以通過(guò)mcc –help命令查看,注意參數(shù)的大小寫。

Matlab編譯后會(huì)在Test文件夾下生成9個(gè)文件,分別是:

mccEcxludedFiles.log

MyDLL.cpp

MyDLL.ctf

MyDLL.dll

MyDLL.exp

MyDLL.exports

MyDLL.h

MyDLL.lib

readme.txt

其中MyDLL.dll,MyDLL.lib,MyDLL.ctf,MyDLL.h是我們需要的文件,至此,Matlab方面就已經(jīng)設(shè)置妥當(dāng)了。

打開VC2008,新建一個(gè)工程,然后將上述四個(gè)文件復(fù)制到工程目錄下。選擇“工具-選項(xiàng)-項(xiàng)目和解決方案-VC++目錄”,在“顯示以下內(nèi)容目錄”里選擇“包含文件”將“D:\Program Files\MATLAB\R2010b\extern\include”添加進(jìn)去,然后選擇“庫(kù)文件”將“D:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft”添加進(jìn)去,其中D:\ProgramFiles是Matlab的安裝目錄,可根據(jù)實(shí)際情況進(jìn)行修改。

然后選擇“項(xiàng)目-屬性-配置屬性-鏈接器-輸入”,在右邊“附加依賴項(xiàng)”一欄填入“myDLL.lib mclmcrrt.lib”,其中MyDLL.lib就是剛剛用Matlab生成的lib文件。

在編寫代碼時(shí)首先得包含頭文件“MyDLL.h”,然后開始編寫需要的代碼,我為了說(shuō)明問(wèn)題編寫了一個(gè)測(cè)試代碼如下所示:


{

MyDLLInitialize(); //初始化DLL動(dòng)態(tài)連接文件


double _x[5] = {1,2,3,4,5}; //輸入數(shù)組

double _y[5]; //輸出數(shù)組


mxArray* x = mxCreateDoubleMatrix(1, 5,mxREAL); //創(chuàng)建1*5矩陣

memcpy(mxGetPr(x), (void*)_x,sizeof(_x)); //拷貝輸入數(shù)據(jù)


mxArray *input[1] = {x}; //將矩陣x的指針作為輸入?yún)?shù)傳遞進(jìn)去

mxArray *output[1]; //定義輸出參數(shù)指針


mlxMyFunc(1,output,1,input); //調(diào)用m函數(shù)

mxArray *y; //定義輸出結(jié)果指針

y = output[0]; //將輸出參數(shù)傳遞給輸出結(jié)果

memcpy(_y, mxGetPr(y), sizeof(_y)); //拷貝輸出數(shù)據(jù)


MyDLLTerminate(); //結(jié)束DLL庫(kù)


//顯示數(shù)組中的數(shù)據(jù)

CString str;

str.Format("%f %f %f %f%f",_y[0],_y[1],_y[2],_y[3],_y[4]);


MessageBox(str);


}

其中MyDLLInitialize(),mlxMyFunc(),MyDLLTerminate()等函數(shù)可以在MyDLL.h中找到函數(shù)原型,mlxMyFunc函數(shù)原型為:

mlxMyFunc(int nlhs, mxArray *plhs[], intnrhs, mxArray *prhs[])

nlhs代表輸出參數(shù)個(gè)數(shù),plhs[]里面存放的是輸出參數(shù)的指針,nrhs代表輸入?yún)?shù)個(gè)數(shù),prhs[]中存放的是輸入?yún)?shù)的指針。上例中由于輸入輸出參數(shù)只有一個(gè),因此在plhs[0]中存放的就是M文件中b的指針,prhs[0]中存放的就是M文件中a的指針。

編譯運(yùn)行之后就可以在彈出的消息框中得到所要的結(jié)果。將項(xiàng)目文件夾下生成的可執(zhí)行文件復(fù)制出來(lái),將MyDLL.dll文件、MyDLL.ctf文件和.exe文件放在同一目錄下便可脫離VC++獨(dú)立運(yùn)行。如果需要在其他未裝Matlab的機(jī)器上運(yùn)行,則還需要將“D:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win32”中的MCRInstaller.exe復(fù)制出來(lái),在未安裝Matlab的電腦上運(yùn)行此程序,才可使得剛剛生成的可執(zhí)行文件順利運(yùn)行。

以上程序在Windows 7 家庭普通版 + Visual Studio 2008 專業(yè)版 SP1 + Matlab R2010b下編譯運(yùn)行通過(guò)。


開放分享:優(yōu)質(zhì)有限元技術(shù)文章,助你自學(xué)成才

相關(guān)標(biāo)簽搜索:matlab生成dll MatLab培訓(xùn) MatLab培訓(xùn)課程 MatLab在線視頻教程 MatLab技術(shù)學(xué)習(xí)教程 MatLab軟件教程 MatLab資料下載 MatLab代做 MatLab基礎(chǔ)知識(shí) Fluent、CFX流體分析 HFSS電磁分析 Ansys培訓(xùn) Abaqus培訓(xùn) 

編輯
在線報(bào)名:
  • 客服在線請(qǐng)直接聯(lián)系我們的客服,您也可以通過(guò)下面的方式進(jìn)行在線報(bào)名,我們會(huì)及時(shí)給您回復(fù)電話,謝謝!
驗(yàn)證碼

全國(guó)服務(wù)熱線

1358-032-9919

廣州公司:
廣州市環(huán)市中路306號(hào)金鷹大廈3800
電話:13580329919
          135-8032-9919
培訓(xùn)QQ咨詢:點(diǎn)擊咨詢 點(diǎn)擊咨詢
項(xiàng)目QQ咨詢:點(diǎn)擊咨詢
email:kf@1cae.com