OPENCV的highgui工程在vc6.0下編譯出錯的解決

查志強發表於2016-02-05

【原文:http://www.cnblogs.com/oskycar/archive/2009/08/30/1556924.html

最近在論壇裡發現有很多人提出如下的問題:

怎麼按照網站上那個安裝方法安裝了,但除錯執行怎麼會出錯啊? 
錯誤是: 
error C2065: 'GetWindowLongPtr' : undeclared identifier 
C:\Opencv1.0\OpenCV\otherlibs\highgui\window_w32.cpp(243) : error C2065: 'GWLP_USERDATA' : undeclared identifier 
C:\Opencv1.0\OpenCV\otherlibs\highgui\window_w32.cpp(432) : error C2065: 'SetWindowLongPtr' : undeclared identifier 
C:\Opencv1.0\OpenCV\otherlibs\highgui\window_w32.cpp(828) : error C2065: 'GetClassLongPtr' : undeclared identifier 
C:\Opencv1.0\OpenCV\otherlibs\highgui\window_w32.cpp(828) : error C2065: 'GCLP_HBRBACKGROUND' : undeclared identifier 
C:\Opencv1.0\OpenCV\otherlibs\highgui\window_w32.cpp(972) : error C2065: 'GCLP_HCURSOR' : undeclared identifier 
C:\Opencv1.0\OpenCV\otherlibs\highgui\window_w32.cpp(1253) : error C2065: 'GWLP_WNDPROC' : undeclared identifier

一直以來都在用vs.net所以一直沒有這類問題。今天為了在一個低端的本本上安裝vc6.0和opencv讓我費很大的力氣才弄明白。

其實是highgui目錄下的window_w32.cpp巨集定義出現的問題, 
#if defined WIN64 || defined EM64T 
上面這個巨集判斷其實應該是返回FALSE才對。但是由於6.0的編譯的問題它這裡就程式設計true了,因而執行了下面的巨集定義

#define icvGetWindowLongPtr GetWindowLongPtr 
#define icvSetWindowLongPtr( hwnd, id, ptr ) SetWindowLongPtr( hwnd, id, (LONG_PTR)(ptr) ) 
#define icvGetClassLongPtr GetClassLongPtr 
#define CV_USERDATA GWLP_USERDATA 
#define CV_WNDPROC GWLP_WNDPROC 
#define CV_HCURSOR GCLP_HCURSOR 
#define CV_HBRBACKGROUND GCLP_HBRBACKGROUND

GetClassLongPtr這些函式應該不是win32的程式,而是win64的程式,因此才會出錯。

解決方法是把#if defined WIN64 || defined EM64T隨便改成一個系統不認識的,沒有定義過的巨集就

行了。如: 改成#if defined WIN642 || defined EM64T 。或者乾脆註釋調上面的全部內容。

對於opencv1.0 版本改過之後就可以編譯_make裡面的opencv.dsw 裡面的highgui.dsp了。對於

5.0beta版本,可能要先把OpenCV\otherlibs\_graphics\src下面的graphic_libs.dsw編譯後才能編譯

highgui.dsp(呵呵,今天把所以版本都試了一遍)

如果以上編譯全部通過,可能還要配置一下環境變數,如:d:\Program Files\OpenCV\bin; 如果不配

置的話會出現找不到coxcore100.dll等檔案的錯誤。vs.net下就不會有以上的麻煩。

 

如果又出現類似tiff,png,jpeg等錯誤,則需要編譯opencv的附加庫,目錄在:

C:\Program Files\OpenCV\otherlibs\_graphics\src


相關文章