




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、摘要:許多工程軟件需要用到復雜的數(shù)學算法。VC+能夠形成各種用戶界面,并 可以直接與系統(tǒng)及底層硬件交換數(shù)據(jù)。因此研究VC+和Matlab的混合編程具有 很大的實際意義。該文討論了如何使用Matlab的Complier將*.m函數(shù)編譯為動態(tài)鏈接庫DLL,提供給VC+調用的方法,提供了一種VC+與Matlab混合編 程的快速實現(xiàn)。關鍵詞: Matlab VC+ MCC Complier 動態(tài)鏈接庫 DLLMatlab 作為當今世界上應用最為廣泛的數(shù)學軟件,具有非常強大的數(shù)值計算、 數(shù)據(jù)分析處理、系統(tǒng)分析、圖形顯示甚至符號運算的功能。已經在如生物工程, 圖像處理,語音處理,雷達探空,聲納探水,地震探
2、地,以及控制論,系統(tǒng)論等 各個領域得到廣泛的應用。 它是一個完整的數(shù)學平臺, 在這個平臺上, 用戶只需 寥寥數(shù)語就可以完成十分復雜的功能, 大大提高了工程分析計算、 圖像處理的效 率。但是 Matlab 強大的功能只能在它所提供的平臺上才能使用,即用戶必須在 安裝 Matlab 系統(tǒng)的機器上才能執(zhí)行 *.m 文件。這樣當用戶需要將在 Matlab 下 已開發(fā)完畢的復雜算法應用到高級語言開發(fā)環(huán)境下時就帶來了問題, 是將現(xiàn)成的 東西集成高級語言開發(fā)的程序中呢?還是用高級語言再重新實現(xiàn)一遍?顯然大 家所期望的是減少工作量, 最好能將 Matlab 下開發(fā)好的程序或函數(shù)直接應用到 高級語言開發(fā)的程序中
3、,這就是 Matlab 與高級語言的混合編程問題。VC+是當前Windows下的主要編程語言之一,它能方便地形成應用軟件中所 需要的各種用戶界面和工具并直接與系統(tǒng)及底層硬件交換數(shù)據(jù)。用VC+開發(fā)的系統(tǒng)具有容易維護升級、 界面友好、代碼效率高、 執(zhí)行速度快等一系列優(yōu)點, 因 此已成為目前應用軟件開發(fā)中廣泛采用的主要工具之一因此, 如何將 Matlab 與 VC+進行有效的混合編程廣受工程科研人員的關注。解決這個問題,不僅能更好地發(fā)揮 Matlab 強大的功能,還能快速地進行軟件開發(fā),尤其是當軟件開發(fā)中需 要實現(xiàn)復雜的數(shù)學算法、圖形處理時尤為迫切。研究VC+與Matlab的混合編程具有很大的實際意
4、義。MATLAB與 Visual C+結合的方法有多種,但其實用程度與范圍不同。常用的方 法有:(1) 將Matlab程序編譯成C/C+源文件并嵌入VC+(2) 在 C/C+程序中利用 Matlabengine 調用 Matlab 函數(shù);(3) 在 C/C+S序中直接使用 Matlab C/C+ Math Library ;(4) 將.m文件編譯成*.dll文件嵌入到VC+的程序中。基于實用性、易用性的 考慮,本文主要討論第四種方法。另外隨著 Matlab 版本的升級,原來的 math library 已經并入了 Compiler 之中,是否是 mathworks 比較推崇 DLL 的方式呢?
5、 本文通過一個簡單的例子來說明 Matlab和VC+混編的具體過程(環(huán)境為 Matlab6.5&VC+6.0) 。1 Matlab 編譯環(huán)境的設置 為了能夠使用Matlab的Complier將*.m函數(shù)文件編譯為動態(tài)鏈接庫 DLL,必須 對 Matlab 的環(huán)境做出相應的配置。具體做法如下:在 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 作準備。然后輸入命令 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 也是調用 Compiler 的命令 mcc 進行編譯工作的, 而且有時候這個 Add-in 還會出現(xiàn)不能使用的情況,因此這里主要討論使用 mcc 命令的方法。關 于 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)境進行一些設置:( 1)設置 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 這里假設<Matlab>為你的Matlab的安裝目錄。這些操作只需要一次, VC+ IDE 就會自動記錄。自動應用到每一個工程( Project )。( 2)工程 (project) 本身的一些設置在
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)為工程添加相應的文件把剛才生成的 mylib.h mylib.dll mylib.lib 和 <Matlab>externlibwin32 下的 libmatpm.lib ,<Matlab>externlibwin32microsofmsvc6下的所有*lib 文件復制到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ù)學庫中的函數(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ù)學庫中的函數(shù) mlfAssign() 等/ 使用 mylib.dll 中的函數(shù)mlfMyfun(t);/ 銷毀 t , 釋放內存 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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 飯店小額入股協(xié)議書
- 飯店招聘廚師協(xié)議書
- 酒吧卡座外包協(xié)議書
- 2025年員工培訓計劃全攻略
- 農家樂入股合同協(xié)議書
- 項目文明施工協(xié)議書
- 養(yǎng)老院老人退養(yǎng)協(xié)議書
- 判決書雙方協(xié)商協(xié)議書
- 酒店轉讓居間協(xié)議書
- 設備臨時使用協(xié)議書
- 2024春期國開電大本科《古代小說戲曲》在線形考(形考任務1至4)試題及答案
- 大學生勞動就業(yè)法律問題解讀-知到答案、智慧樹答案
- MOOC 行政管理學-西北大學 中國大學慕課答案
- 藝術中國智慧樹知到期末考試答案2024年
- 提高臥床患者踝泵運動的執(zhí)行率
- JGJ7-91網架結構設計與施工規(guī)程
- 消防設施維護保養(yǎng)記錄表
- 【語文】《裝在套子里的人》 同步課件 2023-2024學年高一語文(統(tǒng)編版必修下冊)
- 太赫茲光纖技術的進展與應用
- 廣東省普通高中學生檔案
- 中央空調系統(tǒng)(多聯(lián)機)改造設計方案
評論
0/150
提交評論