VisualC++編程環(huán)境作為一個具有卓越性能和可視化編譯環(huán)境的程序開發(fā)工具,可以開發(fā)從底層系統(tǒng)級到高層用戶級的各種軟件。但VC++在圖象處理、工程計算和圖形顯示方面的應(yīng)用夏雜而麻煩。
MATLAB編程語言將數(shù)值分析、矩陣運算、信號處理等高性能的數(shù)值計算與圖形可視化集成在一起,非常有利于工程技術(shù)人員更方便地解決問題,從而大最用于科學(xué)研究和工程領(lǐng)域,然而,MATLAB還存在一些不足:MATLAB編寫的程序不能脫離MATLAB環(huán)境執(zhí)行,以行解釋方式執(zhí)行代碼的機(jī)制限制了代碼執(zhí)行速度,程序源代碼的裸露也不利于知識產(chǎn)權(quán)的保護(hù)。
近幾年,在科學(xué)計算軟件的開發(fā)中,VisualC++MATLAB編技術(shù)越來越受到關(guān)注,采用VisualC++和MATLAB混編技術(shù)能夠充分發(fā)揮VC淚開發(fā)平臺優(yōu)勢,同時又結(jié)合了MATLAB在科學(xué)計算上的優(yōu)點,例如矩陣運算、大最優(yōu)秀的工具箱函數(shù)等,對于軟件的開發(fā)創(chuàng)造了便而可靠的方式。
1 VC和MATLAB集成方式
MATLAB為了改善自身的不足不斷推出應(yīng)用程序接口組件(mex mat engine,MATLAB編譯器MATLAB運行時服務(wù)器等技術(shù),其中應(yīng)用程序接口組件應(yīng)用方便,但是不能脫離MATLAB環(huán)境,MATLAB運行時服務(wù)器仍然是命令解釋執(zhí)行方式,在運行效率上無法與VC等一類基于代碼編譯環(huán)境的編程工具相比。不適用于計算最大的工程,其中MATIAB編譯器(mcd可以將MATLAB的m文件(MATLAI3源程序)翻譯為VC++文件,擂入到VC++編譯器中(如圖1所示),是靈活實現(xiàn)VC++脫離MATLAB環(huán)境調(diào)用MATLAB功能的方法,正越來越多地應(yīng)用到科學(xué)計算軟件的開發(fā)中,雖然很多人開始了解通過mcc編譯器使VC++調(diào)用MATLAB文件的方法,但調(diào)用過程中由于MATLAB文件自身的特點而引起了程序開發(fā)的一些問題,使得很多人并不能真正很好地使用這一方式,本文結(jié)合具體課題中的一個實例對vC斗娜MATLAB混編中的一些難點進(jìn)行分析和解決。MATLAt3提供的MATLAB Add_in宏的工具條可以更方便地在vC環(huán)憧中直接調(diào)用m文件,省掉了編譯和加入工程的手工步驟,但原理還是應(yīng)用了mcc編譯器,性質(zhì)MATLAB為了改善自身的不足不斷推出應(yīng)用程序接相同,為了方便說明,本文中仍采用mcc編譯器的方法說明。
2 混合編程的過程
在某項國防基礎(chǔ)科研項目中,為解決數(shù)控加工過程中加工工藝參數(shù)的選擇和優(yōu)化問題,在對銑削加工過程相關(guān)動力學(xué)仿真技術(shù)進(jìn)行充分研究的基礎(chǔ)上設(shè)計和開發(fā)了一套基于數(shù)控銑削過程的動力學(xué)仿真優(yōu)化應(yīng)用軟件SinuCut整個仿真系統(tǒng)的開發(fā)是基于動力學(xué)仿其分析與研究的前提下,對銑削過程中所涉及到的主要物理最吸銑削力,轉(zhuǎn)矩,功率,刀具和工件振動情況,工件表面形貌,顫振穩(wěn)定域和刀具磨損等方面)給出了仿真計算,軟件的開發(fā)若在MATLAB下實現(xiàn),雖然能夠充分利用M洲的強大的圖形處理功能和數(shù)值計算優(yōu)勢,但仿真運算速度慢,源代碼沒有進(jìn)行編譯,并且依賴MATLAB平臺,獨立性、移植性差。而在VC環(huán)境下開發(fā)則過于繁瑣,采用混編的方式就快捷多了。例如仿真系統(tǒng)軟件中一個子功能是銑削力系數(shù)的辨識,需要以實測的銑削力數(shù)據(jù)以及工況條件用多元線性回歸的方法辨識出銑削力公式的系數(shù),多元線性回歸也可用C++代碼實現(xiàn),但要麻煩得多,然而MATLAB環(huán)境下只要幾個函數(shù)就可解決了,類似這樣的情況不少,考慮到一些復(fù)雜的功能可以由MATLAB工具箱的豐富數(shù)學(xué)函數(shù)輕松解決,因此充分利用MATLAB的工具箱函數(shù)可以使軟件的開發(fā)更加便捷,更加可靠。下面以具體實例說明混合編程的過程:
3 混編過程中的關(guān)鍵技術(shù)
混編過程中,由于調(diào)用了MATLAB的動態(tài)鏈接庫,可能產(chǎn)生如下問題:
(1)C運行時庫和MFC庫沖突造成重復(fù)定義錯誤
編譯過程有時會出現(xiàn)類似下面的錯誤,如:NAFXCW .LIB errprLNiC2Q0}x "void--叫ec,operdtt)J}delete (void*)”3@YAXF}IJC}乃alres}dY debuted } L1}3CTvfT比山}t}obj)其中NAF}CCW. LIB是M FC靜態(tài)連接庫,而LIBCM T.Iib靜態(tài)鏈接的C運行時庫。
這種情況主要是C運行時庫和MFC的庫沖突造成的。由于第三方庫如MATLAB動態(tài)庫的加入,使得在MFC庫運行之前已經(jīng)運行了C運行時庫,造成了重復(fù)定義,解決的辦法就是將那個提示出錯的庫放到另外一個庫的前面,這樣就可以避開這個鏈接錯誤,在VC萊單P rCfjeet>etti}tgx>L. inl>aitlgary選擇input在ObectllibraryModules欄中按順序添入庫的名字,且作為命令行中的前兩個庫,使各個庫按照設(shè)定的順序鏈接。
?。?)C運行時庫沖突造成重復(fù)定義錯誤
VC工程中設(shè)置選項LT se rurYti'n e I ib } ry用來指定程序運行時使用的C運行時庫單線程或多線程,靜態(tài)或動態(tài)鏈接,Debug版本或Release版本),當(dāng)有第三方庫(Third party library)存在時,很容易發(fā)生類似下面這樣的錯誤:errorLNK2005free already defined in LIBC0vIT lib這說明你的工程使用了不同類型的CRT L屯一般如果確定工程里其他的庫都是統(tǒng)一的,很可能問題出在MATLAB庫上,經(jīng)調(diào)試判斷MATLhB庫調(diào)用的是MSVCRT fifa也就是動態(tài)C運行時庫,建議在User Runtine libraryy中選擇M u Iti-Tread.DLL。
由于vc對重復(fù)定義的要求比較嚴(yán)格,用第三方庫時,如果用多種方法都不能解決,可以通過設(shè)置強制忽略重復(fù)定義。
?。?)標(biāo)準(zhǔn)化頭文件引起的沖突
工程中調(diào)用了m文件,要注意有可能標(biāo)準(zhǔn)化頭文件和調(diào)用的m文件翻譯過來的C++件中定義引起沖突,C++標(biāo)準(zhǔn)化以后的標(biāo)準(zhǔn)頭文件把標(biāo)準(zhǔn)C++庫的組件放在一個名為std的名字空間里面,使用時要使用using nanespace std語句使。記空間中所有定義的標(biāo)識符暴露在全局空間中,一般要確定全局空間沒有重名的對象才能這么做。但并不需要特意閱讀和修改的由m文件翻譯過來的C++文件經(jīng)常會被忽略掉,如果在m文件翻譯過來的C++文件使std名字空間可見,則兩個文件里的相同名稱的標(biāo)識符都暴露在可見的名字空間里,這樣標(biāo)準(zhǔn)程序庫中類名和函數(shù)名與MATLAB庫中的類名或是函數(shù)名就有可能發(fā)生名字沖突,從而會引起ambiguoussymbol確定的識標(biāo)符)錯誤。解決方法是避免usingnamespace.sd這類語句放在可能被翻譯過來的C書凌件包含的頭文件中,例如預(yù)編譯頭文件。stlafxh等。
?。?)程序的運行與發(fā)布的問題
當(dāng)調(diào)用的m文件內(nèi)包含圖形功能時,程序運行時可能出現(xiàn)只能執(zhí)行一次的情況,報錯:runtine errorabnnmal prngram teminationo這是因為M 1}TLAB中函數(shù)的操作一定要在初始化M}LTLAB函數(shù)庫和圖像函數(shù)庫后才能調(diào)用,不然會出現(xiàn)“需要C,C+涵數(shù)庫”的錯誤提示,而數(shù)學(xué)庫的啟動和關(guān)閉要保證程序的執(zhí)行過程中它們分別只被調(diào)用1次,第二次調(diào)用就會出錯,所以最好將數(shù)學(xué)庫的啟動和關(guān)閉語句放在程序的初始化和程序徹底退出函數(shù)中。
由于程序中調(diào)用了ATLAB數(shù)學(xué)函數(shù)庫或圖形庫中的函數(shù),所以需要附帶ATLAB的這些函數(shù)庫才能在沒有安裝ATLAB的機(jī)器上運行,mglinstaller.exe解壓出的bin\win32目錄下的所有鏈接庫拷到開發(fā)程序的所在目錄中并隨程序一起移植即可。
4 結(jié)束語
本文討論的動力學(xué)仿真軟件開發(fā)實例是在VisualC++6.0和MATLAB的平臺上編譯運行的,通過VisualC++C++ MATLAB混編技術(shù)可以結(jié)合VisualC++強大開發(fā)能力和MATLAB的豐富的工具箱快速開發(fā)出融合大量科學(xué)計算功能的應(yīng)用程序,這種混編技術(shù)的研究和開發(fā)在圖象處理、信號處理等需要大景計算、可視化界面的工程應(yīng)用領(lǐng)域有廣泛的應(yīng)用價值。靈活運用這種聯(lián)合編程方法,能夠開發(fā)出界面友好、功能強大、不依賴于MATLAB環(huán)境的應(yīng)用程序軟件,并有效地提高應(yīng)用系統(tǒng)的精確度和穩(wěn)定性。
(審核編輯: 智匯胡妮)
分享