按上篇文章《Qt4.8下應用OpenCV2.4.4搭建環境詳細步驟(Win7系統)》 http://www.linuxidc.com/Linux/2013-04/83231.htm
在Qt Creator中配置了OpenCV2.4.X,但是只能使用opencv1.0的函數,opencv2中的函數,例如:imread(),Mat結構等都不能使用。
找原因:
(1)看頭文件有沒有問題
將include和lib目錄的配置由qmake.conf文件中改到工程中的pro文件中,以便於修改。
這裡說明一下,如果在qmake.conf文件中配置include和lib文件目錄,則#include後面的opencv頭文件會加下劃線,說明IDE找不到這些頭文件,而且寫函數的時候沒有自動補全。但是編譯時沒有錯,因為構建的時候可以找到這些目錄。如果在pro文件中配置include和lib文件目錄,IDE就知道了這些目錄,所以寫函數的時候還有自動補全,更利於檢查錯誤。
包含進opencv2的頭文件
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
試了opencv2中的imread()函數,有自動補全提示,說明編譯器已經找到了這些頭文件。
但構建的時候會出現:
undefined reference to `cv::imread(std::string const&, int)' 等
說明編譯器找不到lib庫文件
(3)找lib庫文件的問題
lib文件的包含如下:
LIBS += C:\opencv\build\x86\vc10\lib\opencv_core243d.lib\
C:\opencv\build\x86\vc10\lib\opencv_highgui243d.lib\
C:\opencv\build\x86\vc10\lib\opencv_imgproc243d.lib\
按說沒有問題,網上也都是這樣配的,但是我這裡就一直有問題。
情況是這樣的:
①不加這些lib文件,當然opencv1和opencv2的函數都不能用,都說undefined reference
②加上這些lib文件,opencv1中的函數能用,opencv2中新添加函數和結構不能用,例如:Mat結構,imread函數,VideoCapture結構等
這說明,opencv2新添加的函數和結構不在這些lib文件中。
後來,又新添加了幾個lib文件:
C:\opencv\build\x86\mingw\lib\libopencv_core243.dll.a\
C:\opencv\build\x86\mingw\lib\libopencv_highgui243.dll.a\
C:\opencv\build\x86\mingw\lib\libopencv_imgproc243.dll.a
這次編譯沒問題了,說明這些lib文件裡有opencv2新添加的東西。
(4)dll的問題
這時雖然編譯沒問題了,但運行的時候還是有問題(此時已經將對應的dll文件拷貝到system32文件夾下了),說程序異常終止,知道可能是缺dll文件。
進debug目錄直接運行exe文件,按照提示缺少哪些文件去網上找,前兩個都找到了,第三個是” libstdc++-6.dll”,找了好幾個都說dll文件有錯誤。把MinGW目錄下的這個dll文件復制過去也說是同樣的錯誤。於是搜索錯誤信息,於是找到opencv中文網的下面一片文章,和我的錯誤一模一樣:
====================================================
新手求助,_ZNSt9exceptionD2Ev錯誤
我是OpenCV的新手···我用OpenCV2.4最新版本結合CodeBlock配置的環境。並使用Opencv帶的樣例測試。編譯通過了,但是一運行就會報錯:無法定位程序輸入點_ZNSt9exceptionD2Ev於動態鏈接庫libstdc++-6.dll上我不明白這是什麼錯誤,請高手幫助····謝謝了
Re:新手求助,_ZNSt9exceptionD2Ev錯誤
我不清楚你用什麼編譯器來編譯你自己寫的opencv程序,以我的經驗,你需要用一個4.6.x版本的mingw來鏈接官方的opencv2.4的庫。因為官方opencv2.4的庫是用mingw4.6.x版本編譯的。
好謝謝現在我試試等下給你回復呵呵
我換了最新的版本MinGW,結果顯示還是無法定位程序輸入點_ZdlPv 於動態鏈接庫libstdc++-6.dll
我前面都和你說了,不能用最新版的MinGW,只能用4.6.x版本的MinGW。
http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.6.3/32-bit/threads-win32/dwarf/x32-4.6.3-release-win32-dwarf-rev0.7z/download 用這個版本肯定可以。
===========================================
看了大神的恢復,知道了是MinGW的版本問題,又下載了一個MinGW,把libstdc++-6.dll文件拷過去,果然OK了。現在可以用OpenCV2中的函數了。
總結一下:
(1)下載的OpenCV2.4.X版本,已經編譯好的lib文件中,只有C:\opencv\build\x86\mingw\lib
這個目錄下的lib文件有opencv2的新函數,而C:\opencv\build\x86\vc10\lib這個目錄下的lib文件中沒有opencv2的新函數,所以一開始包含這個目錄下的lib文件會找不到新函數的實現。
(2)另一種使用opencv2的方法就是用cmake自己編譯生成dll和lib文件,這樣裡面就有了新的函數。不過比較麻煩。