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。等等吧,還要添加頭文件啥的,這里完成這些已經是告一段落了,已經有了比較大的成就。剩下的就是研究怎么建工程,研究代碼了。 參考(給點啟發的也算,亂序) http://zhidao.baidu.com/link?url=nr4dCxDgQt6CV_W6dta1r4rYL2u2lhy51KAuxco6g_vzPNYMI7aXlf32bEodXQx0LtDvhM1LEcWFxFLVNWmqeq
http://www.cnblogs.com/xpvincent/archive/2013/02/05/2893046.html
http://www.ilovematlab.cn/thread-205148-1-1.html
http://www.ilovematlab.cn/thread-62535-1-1.html
http://www.ilovematlab.cn/thread-62548-1-1.html
http://wenku.baidu.com/link?url=ntR67NsL5qpcGN1ItOr4o95jEyPYBsQlR_RdOAN1WlzSqD_Oy9waLP49D90mdcS0r9GmF8qPCI5kf5504qH8eNbOYChwT-rAUf3BhweTK0W
http://www.ilovematlab.cn/thread-89416-1-1.html
http://blog.sina.com.cn/s/blog_6d04b0d10101n7i2.html
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。等等吧,還要添加頭文件啥的,這里完成這些已經是告一段落了,已經有了比較大的成就。剩下的就是研究怎么建工程,研究代碼了。 參考(給點啟發的也算,亂序) http://zhidao.baidu.com/link?url=nr4dCxDgQt6CV_W6dta1r4rYL2u2lhy51KAuxco6g_vzPNYMI7aXlf32bEodXQx0LtDvhM1LEcWFxFLVNWmqeq
http://www.cnblogs.com/xpvincent/archive/2013/02/05/2893046.html
http://www.ilovematlab.cn/thread-205148-1-1.html
http://www.ilovematlab.cn/thread-62535-1-1.html
http://www.ilovematlab.cn/thread-62548-1-1.html
http://wenku.baidu.com/link?url=ntR67NsL5qpcGN1ItOr4o95jEyPYBsQlR_RdOAN1WlzSqD_Oy9waLP49D90mdcS0r9GmF8qPCI5kf5504qH8eNbOYChwT-rAUf3BhweTK0W
http://www.ilovematlab.cn/thread-89416-1-1.html
http://blog.sina.com.cn/s/blog_6d04b0d10101n7i2.html
總結
以上是生活随笔為你收集整理的MFC与Matlab编程总结 (以《Matlab与C/C++混合编程技术(第三版)》-刘维 第五章 生成DLL为例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux必备工具,Linux装机必备工
- 下一篇: c语言利用文件体写在桌面上,在C语言中怎