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。等等吧,還要添加頭文件啥的,這裏完成這些已經是告一段落了,已經有了比較大的成就。剩下的就是研究怎麼建工程,研究代碼了。
參考(給點啓發的也算,亂序)










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章