matlab與vc混合編程之動態(tài)鏈接庫(.dll)_第1頁
matlab與vc混合編程之動態(tài)鏈接庫(.dll)_第2頁
matlab與vc混合編程之動態(tài)鏈接庫(.dll)_第3頁
matlab與vc混合編程之動態(tài)鏈接庫(.dll)_第4頁
matlab與vc混合編程之動態(tài)鏈接庫(.dll)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、摘要:許多工程軟件需要用到復(fù)雜的數(shù)學(xué)算法。VC+能夠形成各種用戶界面,并 可以直接與系統(tǒng)及底層硬件交換數(shù)據(jù)。因此研究VC+和Matlab的混合編程具有 很大的實際意義。該文討論了如何使用Matlab的Complier將*.m函數(shù)編譯為動態(tài)鏈接庫DLL,提供給VC+調(diào)用的方法,提供了一種VC+與Matlab混合編 程的快速實現(xiàn)。關(guān)鍵詞: Matlab VC+ MCC Complier 動態(tài)鏈接庫 DLLMatlab 作為當(dāng)今世界上應(yīng)用最為廣泛的數(shù)學(xué)軟件,具有非常強大的數(shù)值計算、 數(shù)據(jù)分析處理、系統(tǒng)分析、圖形顯示甚至符號運算的功能。已經(jīng)在如生物工程, 圖像處理,語音處理,雷達(dá)探空,聲納探水,地震探

2、地,以及控制論,系統(tǒng)論等 各個領(lǐng)域得到廣泛的應(yīng)用。 它是一個完整的數(shù)學(xué)平臺, 在這個平臺上, 用戶只需 寥寥數(shù)語就可以完成十分復(fù)雜的功能, 大大提高了工程分析計算、 圖像處理的效 率。但是 Matlab 強大的功能只能在它所提供的平臺上才能使用,即用戶必須在 安裝 Matlab 系統(tǒng)的機器上才能執(zhí)行 *.m 文件。這樣當(dāng)用戶需要將在 Matlab 下 已開發(fā)完畢的復(fù)雜算法應(yīng)用到高級語言開發(fā)環(huán)境下時就帶來了問題, 是將現(xiàn)成的 東西集成高級語言開發(fā)的程序中呢?還是用高級語言再重新實現(xiàn)一遍?顯然大 家所期望的是減少工作量, 最好能將 Matlab 下開發(fā)好的程序或函數(shù)直接應(yīng)用到 高級語言開發(fā)的程序中

3、,這就是 Matlab 與高級語言的混合編程問題。VC+是當(dāng)前Windows下的主要編程語言之一,它能方便地形成應(yīng)用軟件中所 需要的各種用戶界面和工具并直接與系統(tǒng)及底層硬件交換數(shù)據(jù)。用VC+開發(fā)的系統(tǒng)具有容易維護升級、 界面友好、代碼效率高、 執(zhí)行速度快等一系列優(yōu)點, 因 此已成為目前應(yīng)用軟件開發(fā)中廣泛采用的主要工具之一因此, 如何將 Matlab 與 VC+進行有效的混合編程廣受工程科研人員的關(guān)注。解決這個問題,不僅能更好地發(fā)揮 Matlab 強大的功能,還能快速地進行軟件開發(fā),尤其是當(dāng)軟件開發(fā)中需 要實現(xiàn)復(fù)雜的數(shù)學(xué)算法、圖形處理時尤為迫切。研究VC+與Matlab的混合編程具有很大的實際意

4、義。MATLAB與 Visual C+結(jié)合的方法有多種,但其實用程度與范圍不同。常用的方 法有:(1) 將Matlab程序編譯成C/C+源文件并嵌入VC+(2) 在 C/C+程序中利用 Matlabengine 調(diào)用 Matlab 函數(shù);(3) 在 C/C+S序中直接使用 Matlab C/C+ Math Library ;(4) 將.m文件編譯成*.dll文件嵌入到VC+的程序中。基于實用性、易用性的 考慮,本文主要討論第四種方法。另外隨著 Matlab 版本的升級,原來的 math library 已經(jīng)并入了 Compiler 之中,是否是 mathworks 比較推崇 DLL 的方式呢?

5、 本文通過一個簡單的例子來說明 Matlab和VC+混編的具體過程(環(huán)境為 Matlab6.5&VC+6.0) 。1 Matlab 編譯環(huán)境的設(shè)置 為了能夠使用Matlab的Complier將*.m函數(shù)文件編譯為動態(tài)鏈接庫 DLL,必須 對 Matlab 的環(huán)境做出相應(yīng)的配置。具體做法如下:在 Matlab 的 Comma nd Win dow下 輸入命令 mbuild - setup,并根據(jù) Matlab 的 提示選擇合適的編譯器,筆者使用的是 Microsoft Visual C+ 。過程如下:>> mbuild -setupPlease choose your com

6、piler for building standalone MATLABapplications:Would you like mbuild to locate installed compilers y/n?Select a compiler:1 Lcc C version 2.4 in D:MATLAB6P5syslcc2 Microsoft Visual C/C+ version 7.0 in C:Program FilesMicrosoftVisual Studio .NET3 Microsoft Visual C/C+ version 6.0 in D:Microsoft Visua

7、l Studio0 NoneCompiler: 3Please verify your choices:Compiler: Microsoft Visual C/C+ 6.0Location: D:Microsoft Visual StudioAre these correct?(y/n):然后,在 Comma nd Win dow中 輸入命令 cd(prefdir);mccsavepath; 這是為了后面 使用Matlab在VC+ IDE中的Add-in 作準(zhǔn)備。然后輸入命令 mex- setup,以 類似的方法配置編譯器。 至此, Matlab 的配置完成。 如有疑問, 可以參閱 Matl

8、ab 的幫助 MatlabCompilerGetting StartedInstallation and configuration 一 節(jié)。2 創(chuàng)建動態(tài)鏈接庫( *.DLL)創(chuàng)建動態(tài)鏈接庫主要有兩種方法: 一種是使用 Matlab 為 VC+IDE 提供的 Add-in 。這種方法比較簡單, 方便快捷, 只要在VC+中創(chuàng)建工程的時候選擇 Matlab Project Wizard ,并且在接下來的 Step 1 中的 Visual Matlab Application Type 選擇 Shared M-DLL 就可以了。 接下來就是添加 *.m 文件,進行編譯了。另一種方法就是使用Matla

9、b的mcc命令將*m文件編譯為動態(tài)鏈接庫(*DLL ) 因為 Add-in 也是調(diào)用 Compiler 的命令 mcc 進行編譯工作的, 而且有時候這個 Add-in 還會出現(xiàn)不能使用的情況,因此這里主要討論使用 mcc 命令的方法。關(guān) 于 mcc 有很多參數(shù)可以使用, 而且有多種用法, 具體的可以參見 Matlab 的幫助。 這里我們使用命令 mcc-B csglsharedlib:youlibname function1 funcion2 , 來創(chuàng)建我們所需要的動態(tài)鏈接庫 DLL文件。其中參數(shù)-B表示使用的是BundleFiles作為參數(shù),csglsharedlib 是-B的參數(shù),意思是生

10、成使用 Matlab圖形庫 的C共享動態(tài)鏈接庫,youlibname是你想要生成的動態(tài)鏈接庫DLL的文件名, 注意 csglsharedlib 與 youlibname 之間有一個冒號“ :” 連接, function1 為 你想要加入到動態(tài)鏈接庫 DLL 中的函數(shù)名,如果有多個函數(shù),各個函數(shù)名用空 格隔開。在我們的例子中, 首先創(chuàng)建所需的 Matlab 函數(shù)文件 myfun.m。function y=myfun(timeend)t=0:0.001:timeend;y=sin(2*pi*50*t);plot(y);然后使用命令 mcc-B csglsharedlib:mylib myfun生成

11、動態(tài)鏈接庫 DLL。Matlab 會生成一系列文件, 其中 mylib.h mylib.lib mylib.dll 以及相同目錄下的 下的 FigureMenuBar.fig 和 FigureToolBar.fig 是我們在以后所需要使用的。3在VC+沖使用Matlab生成的動態(tài)鏈接庫(*.DLL)為了能在VC+中使用上面生成的*.DLL,首先要對VC+勺環(huán)境進行一些設(shè)置:( 1)設(shè)置 Include 和 Library 目錄在 VC+ IDE 中選擇 Tools->Options->Directories 。在 Show directoris for:中選擇 Include fi

12、les , 添加如下兩個目錄:<Matlab>externinclude<Matlab>externincludecpp在 Show directoris for:中選擇 Library files , 添加如下兩個目錄:<Matlab>externlibwin32<Matlab>externlibwin32microsofmsvc6 這里假設(shè)<Matlab>為你的Matlab的安裝目錄。這些操作只需要一次, VC+ IDE 就會自動記錄。自動應(yīng)用到每一個工程( Project )。( 2)工程 (project) 本身的一些設(shè)置在

13、VC+ IDE 中選擇 Project->Setting->C/C+在 Category 中選擇 Code Generation , 在 Use run-time library 中選擇 Multithreaded DLL 。在 Category 中選擇 Precompiled Headers ,選擇 Automatic use of precompiled headers ,并且在 Through header 下面添加 stdafx.h 。在 Category 中選擇 Preprocessor ,在 preprocessor definitions 中添加MSVC,MSWIND

14、,IBMPC在 VC+ IDE 中選擇 Project->Settings->Link在 Categories 中選擇 Input , 在 Ignore libraries: 中填入: msvcrt.lib 。3)為工程添加相應(yīng)的文件把剛才生成的 mylib.h mylib.dll mylib.lib 和 <Matlab>externlibwin32 下的 libmatpm.lib ,<Matlab>externlibwin32microsofmsvc6下的所有*lib 文件復(fù)制到VC+工程的文件夾,并且用 add files to project , 添加

15、的工程中。接下來就可以使用剛才生成的動態(tài)鏈接庫 mylib.dll 了。首先要在使用 DLL 中函數(shù)的源文件中加上頭文件 mylib.h 。在使用之前還需要對 mylib.dll 進注冊,使用完畢之后需要對其進行釋放。注冊使用函數(shù) mylibInitiallize(); 釋放使用函數(shù) mylibTerminate() 。函數(shù)名的規(guī)則就是 youlibname+Initialize(Terminate) 。這兩函數(shù)在 mylib.h 中可以找到。 mylibInitialize() 不僅注冊了剛才生成的 mylib.dll ,同時它也注冊了 Matlab 本身的一些動態(tài)鏈接庫( * . DLL

16、); 同理 mylibTerminate() 不僅釋放了剛才生 成的 mylib.dll ,同時它也釋放了 Matlab 本身的一些動態(tài)鏈接庫 (*.DLL )。因 此在注冊了 mylib.dll 之后,我們也可以使用 Matlab 的數(shù)學(xué)庫中的函數(shù), 例 如 mlfabs() , mlfAssign() 等等。在使用mylib.dll 的時候,存在著一個VC+和mylib.dll中的函數(shù)之間數(shù)據(jù)交互的問題。由于 mylib.dll 中的函數(shù)所接受的參數(shù)是 mxArray 型數(shù)據(jù)。因此我 們要使用 Matlab 為我們提供的 External Interfaces/ API 函數(shù)來創(chuàng)建 mxA

17、rray 型數(shù)據(jù) , 大量的 API 函數(shù)可以參見 Matlab 的幫助文件 MatlabExternal Interfaces/API ReferenceC MX-Functionsx小節(jié)。還有一個需要注意的問題就是原來的函數(shù)名 myfun 變成了 mlfMyfun ??梢栽?mylib.h 中看到。下面就是一個實例/ 包含頭文件 #include “ mylib.h/ 注冊動態(tài)鏈接庫mylibInitialize();double x=0.04;/ 創(chuàng)建 mxArray 型數(shù)據(jù)并對其賦值mxArray *t;t=mxCreateDoubleMatrix(1,1,mxREAL); memcp

18、y(mxGetPr(t),&x,sizeof(double);/ 或者使用 t=mxCreateDoubleScalar(x)/ 或者使用 Matlab 數(shù)學(xué)庫中的函數(shù) mlfAssign() 等/ 使用 mylib.dll 中的函數(shù)mlfMyfun(t);/ 銷毀 t , 釋放內(nèi)存 mxDestroyArray(t);/ 注銷動態(tài)鏈接庫 mylibTerminate();4 程序的發(fā)布在程序完成之后, 就可以進行打包發(fā)布了。 需要注意的問題就是發(fā)布的時候除了 生成的 mylib.dll 和 FigureMenuBar.fig 、FigureToolBar.fig ,還需要加上 Matlab 的一些動態(tài)鏈接。這樣發(fā)布的程序就可以完全脫離 Matlab 的環(huán)境而獨 立運行了。如何得到這些動態(tài)鏈接庫呢?將 <matlab>externlibwin32 下的 mglinstaller

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論