在靜態庫下使用MFC和共享DLL下使用MFC 這兩種情況 opencv的配置,以及配置opencv配置中容易出現的問題

jsjliuyun發表於2014-05-25

       網上也有很多部落格描述VS下opencv的配置,其實opencv的配置很簡單,但是複雜就出現在你不同情況下配置opencv是有所不同的。

本作者絕對是看了網上幾乎所有的部落格,並且親自配置,且在配置中出現了一個問題,用了整整一天的時間才搞好。

如果你做的專案要釋出,最後肯定要將動態連結庫DLL寫到exe檔案中,這樣才能使你的軟體/系統具有可移植性。

(大家通常在用MFC寫小專案的時候書上/教學視訊一般都是推薦你選擇共享DLL下使用MFC)

以後真正遇到專案時才知道,最後都是要選擇靜態庫下使用MFC的。

稍後我會詳細描述在靜態庫下使用MFC  怎麼去調整opencv的配置

基本的opencv配置可分為以下四步(本文中opencv是安裝在D:\Program Files\opencv)

1.設定系統的環境變數(Path)

計算機->(右鍵)屬性->高階系統設定->高階(標籤)->環境變數->(雙擊)path(使用者,系統裡面的path任選其一)->在變數值裡面新增;D:\Program Files\opencv\build\x86\vc10\bin(注意不同路徑之間有個分號)

x86--------- 代表32位系統

x64--------- 代表64位系統

下面是配置系統環境變數的圖

傳圖失敗,請大家見諒哈!

2.設定VS中vc++目錄的包含目錄庫目錄以及執行目錄

包含目錄中編輯新增如下(這裡面全是放著.h  .hpp等檔案)

D:\Program Files\opencv\build\include
D:\Program Files\opencv\build\include\opencv
D:\Program Files\opencv\build\include\opencv2

庫目錄(設定lib檔案的)

D:\Program Files\opencv\build\x86\vc10\lib

執行目錄(設定DLL動態連結庫的,程式要用到的dll檔案)

D:\Program Files\opencv\build\x86\vc10\bin

注意:配置執行目錄和配置VS中的環境變數PATH的效果是等同的,配置一個即可

3.附加依賴項的新增

首先宣告一個opencv的Bug

如果你想你的opencv程式碼在Release和Debug下都可以完美執行這是不可能的!!!

(因為在呼叫依賴項的時候,兩種情況下切換總會出現問題)

迴歸到正題新增附加依賴項

專案---屬性---連結器---輸入--第一行便是附加依賴項

Release下附加依賴項
opencv_calib3d247.lib
opencv_contrib247.lib
opencv_core247.lib
opencv_features2d247.lib
opencv_flann247.lib
opencv_gpu247.lib
opencv_highgui247.lib
opencv_imgproc247.lib
opencv_legacy247.lib
opencv_ml247.lib
opencv_nonfree247.lib
opencv_objdetect247.lib
opencv_ocl247.lib
opencv_photo247.lib
opencv_stitching247.lib
opencv_superres247.lib
opencv_ts247.lib
opencv_video247.lib
opencv_videostab247.lib



debug下附加依賴項
opencv_calib3d247d.lib
opencv_contrib247d.lib
opencv_core247d.lib
opencv_features2d247d.lib
opencv_flann247d.lib
opencv_gpu247d.lib
opencv_highgui247d.lib
opencv_imgproc247d.lib
opencv_legacy247d.lib
opencv_ml247d.lib
opencv_nonfree247d.lib
opencv_objdetect247d.lib
opencv_ocl247d.lib
opencv_photo247d.lib
opencv_stitching247d.lib
opencv_superres247d.lib
opencv_ts247d.lib
opencv_video247d.lib
opencv_videostab247d.lib
謹記:儘量不要將Debug和Release的都新增進去,如果你比較喜歡常用Debug下,你就只新增Debug下的附加依賴項(這點的原因一會兒再說)

到這基本是opencv算是都配置完成了,一般情況下是不會出現問題的,下面列舉一些特殊情況供大家參考



重頭戲來了哈!

1.我每次建立一個專案需要用opencv都需要配置以上這些步驟麼?

當然可以解決不需要,一次就可以成功哈!

開啟你任意的專案,然後按照下圖進入到屬性管理器



2.  一執行自己的程式就提示缺少各種opencv_core230d.dll等檔案

答:這種情況是最容易解決的,肯定是你係統VS中的環境變數PATH(這裡指的是VS中的PATH)/或者執行目錄沒有配置好,這需要配置一個即可哈!



3.怎麼製作一個靜態的opencvDemo?

4.我在自己電腦上寫的軟體(用到oepncv庫的)怎麼在別人電腦上(未配置環境的機子)執行?

5.MFC專案中選擇在靜態庫下使用MFC的話,怎麼配置opencv環境

注意:上面的問題都是一個解決辦法

1.首先,你的lib選擇staticlib

也就是VC++目錄中的包含目錄應該為如下路徑

D:\Program Files\opencv\build\x86\vc10\staticlib

2.然後,屬性頁---配置屬性----MFC的使用---在靜態庫下使用MFC

這樣會將你程式用到的一些庫寫到你的exe檔案中,換來的是可移植性,但是exe檔案會稍微大一些哈!這是沒辦法的,因為你要將你程式用到的一些庫寫到裡面,自然就大了哈!

3.再然後,屬性----C/C++ -----程式碼生成----執行庫選擇位多執行緒除錯(/MTd)

如果出現錯誤的話就換其他執行庫方式(不出意外的話應該是這樣哈)


在靜態庫下會出現這種異常錯誤

windows已在xx.exe中觸發一個斷點,其原因可能是堆被損壞,這說明xx.exe中或它所載入的任何DLL中有bug。 
原因也可能是使用者在xx.exe具有焦點時按下了F12。
輸出視窗可能提供了更多診斷資訊 。

解決辦法

1.確實是你程式錯誤,如果程式錯誤最有可能是你new的指標沒有delete,或者某個記憶體沒有分配就開始用再或者就是野指標等情況,最好單步除錯,注意指標和陣列,應該不難查出來錯誤哈!

2.就是opencv的配置錯誤

我在配置好opencv後發現我的程式在共享DLL下使用MFC是沒有錯誤,但是一旦選擇了靜態庫下使用MFC就出現了上面的錯誤

開始我也認為是指標的問題,可我單步調後感覺不對,所以又從配置上下了功夫,是一篇部落格中的一句話提醒了我

Debug下面可能引用了Release下面靜態編譯的庫。

因為我開始將所有的dll都新增到了附加依賴項,我是在Debug下進行除錯的,同時又選擇了靜態編譯,所以這些附加依賴項裡面還有Release的dll,而我的程式碼就是引用了這些靜態編譯的庫才會出現的問題,我隨即將Release的dll從附加依賴項中去除,馬上就好了哈!




-----以上就是自己在配置opencv的一些問題,歡迎大家補充,凡是有opencv配置方面的問題,請評論我會盡自己所能來解決哈!---


相關文章