1. 程式人生 > >MFC與Matlab程式設計總結 (以《Matlab與C/C++混合程式設計技術(第三版)》-劉維 第五章 生成DLL為例)

MFC與Matlab程式設計總結 (以《Matlab與C/C++混合程式設計技術(第三版)》-劉維 第五章 生成DLL為例)

     近期要完成一個任務,把人臉超解析度的演算法整合在一個系統中,嵌入人臉庫及字典集等。老闆的要求是有比較好的介面,目前也只能是VS那一套了,前一段時間完成的專案是用的MFC,這次也就是用MFC來完成吧。但是問題是,以前寫的人臉超解析度的演算法都是用Matlab寫的,Matlab有非常好的矩陣計算能力,要想把演算法在C++下重新實現,短時間內有點困難。那就把Matlab演算法封裝成DLL吧,Matlab基本上是用C寫的,有比較好的相容性,目前晚上也有不少關於C++與Matlab混合程式設計的資料。在圖書館找書的時候無意間找到了劉維的那本《精通Matlab與C/C++混合程式設計》(第三版),看著介紹不錯,準備按照上面的方法做。
     昨天一整天(上午9:00--晚上12:00),外加前天一晚上(加班到凌晨一點),我幾乎遇到了所有人遇到問題的集合,完美的走過了“大彎路”,今天早上終於搞定了這本書介紹的C++使用Matlab封裝的DLL的例子。先不囉嗦那些彎路,直接介紹如何正確的使用這本書中的五章的第二個例子。     注意:提前宣告一下,這裡我是在32位系統中完成的,至於64位系統,我嘗試了兩種,winXP64位,win8.1,都不行,不能識別DLL裡面的函式,應該是有些庫沒加進去,或者這些庫跟32位的有區別,嘗試了win64那個資料夾也不行,暫時沒有解決方案,待研究。另外,如果您是matlab2013b,抱歉,不能配置VC編譯器(mcc),也就不能編譯出自己的dll,lib,h檔案。目前“市場”上所有破解Matlab2013b都不能配置編譯器,至少我沒有找到一個成功的案例,除非您是土豪,自己買的正版。
     沒有在圖書館借到這本書的光碟,所以就在網上下載了這本書的原始碼。但是這些原始碼的檔名都有問題--每個檔名後面都多了一個下劃線。這是錯誤的,需要寫個批處理把這些檔案重新命名,去掉那個下劃線,否則,不能載入解決方案的工程檔案。不嫌麻煩就自己手動改,反正檔案也不多。      書中的例子都是用VC2010 + Matlab 2010b(也是7.14),而且書中的程式碼直接是工程檔案,裡面的包含目錄(include)和庫目錄都需要根據自己機器實際安裝目錄修改(真蛋疼)。我對VC2010配置附加庫還不是很熟悉,一般我都是按照OpenCV的方式配置,這本書中給的配置方式不太一樣,詳細的配置方式在書中195頁有介紹。下面兩張圖是他的配置:
圖-1  圖-2      其中圖-1 表示的包含目錄,也就是(include),注意是在C/C++ --> 常規裡面,書的作者的Matlab是安裝在D盤,這裡的Include目錄對應著“C:\Program Files\MATLAB\R2012a\extern\include”,這裡紅字是我的安裝目錄,另外裡面還有一個win32資料夾,最好也新增到裡面。總結一下,就是把:“C:\Program Files\MATLAB\R2012a\extern\include”和“C:\Program Files\MATLAB\R2012a\extern\include\win32”新增到包含目錄中。      圖-2 表示的是庫目錄,是在連結器 --> 常規中,這裡對應著“C:\Program Files\MATLAB\R2012a\extern\lib\win32\microsoft”,把這個目錄新增到庫目錄中。      注意:以上我都是在修改作者的程式碼,因為作者的Matlab安裝在D盤,我的安裝在C盤。還有,這是作者的方式,我是按照OpenCV新增包含目錄和庫目錄的方法,不知道的可以查一下相關知識。      還有,作者只用的是Matlab2010b,我用的是2012a,版本不用編譯器不用,這時候直接執行修改好的工程,會有意想不到的錯誤,如下圖所示: 圖-3      圖-3顯示的錯誤讓我鬱悶了好長時間,我對matlab並不是很熟悉,導致整個過程都是在走彎路,上面顯示的編號是Matlab的編譯器版本,7.14表示的Matlab2010b的便器版本號,因為我們到目前為止還是用的作者提供的dll、lib、h檔案,(這三個檔案在工程根目錄中能夠看到),這三個檔案是在2010b版本中生成的,需要2010b版本的編譯器,也就是MCR(不瞭解的自己查查,這個東西比較多),我的機器安裝的是2012a,編譯器應該是8.**,所以顯示找不到7_14的DLL檔案。這需要我們自己重新把matlab的m檔案編譯成DLL庫。      需要配置mcc編譯器(這個不瞭解的也查查吧,介紹太多了)在matlab命令狂中輸入"mbuild -setup",然後如下圖:選擇VC2010的編譯器。
>> mbuild -setup
Welcome to mbuild -setup.  This utility will help you set up 
a default compiler.  For a list of supported compilers, see 
http://www.mathworks.com/support/compilers/R2012a/win32.html

Please choose your compiler for building shared libraries or COM components:

Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2012a\sys\lcc
[2] Microsoft Visual C++ 2010 in C:\Program Files\Microsoft Visual Studio 10.0
[3] Microsoft Visual C++ 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler: 2
Please verify your choices:

Compiler: Microsoft Visual C++ 2010 
Location: C:\Program Files\Microsoft Visual Studio 10.0

Are these correct [y]/n? y
****************************************************************************
  Warning: Applications/components generated using Microsoft Visual C++     
           2010 require that the Microsoft Visual Studio 2010 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:\Documents and Settings\zhaoying\Application Data\MathWorks\MATLAB\R2012a\compopts.bat
From template:              C:\PROGRA~1\MATLAB\R2012a\bin\win32\mbuildopts\msvc100compp.bat

Done . . . 
然後轉到存放m檔案的資料夾(提前存好,比如我見了一個vc的資料夾,裡面放著sincplot.m),然後輸入:
mcc -B csharedlib:libsincplot sincplot.m
然後,得到這些(圖-4)檔案,但是我們只需要,dll、lib、h三個檔案
圖-4
     把這三個檔案覆蓋工程中的三個檔案,再執行程式:       圖-5      以上我們都是在這本書的例子上直接修改的配置,正常的新建一個工程,除了以上的步驟,還需要新增附加依賴項。如圖-6所示: 圖-6      在附加依賴項中新增兩個lib檔案:libsincplot.lib mclmcrrt.lib,注意在配置時用回車隔開,若需要其他功能還需要新增其他的裡邊檔案,libmx.lib libmat.lib  mclmcr.lib。等等吧,還要新增標頭檔案啥的,這裡完成這些已經是告一段落了,已經有了比較大的成就。剩下的就是研究怎麼建工程,研究程式碼了。 參考(給點啟發的也算,亂序)