2011-08-02 28 views
0

我已經成功地建立和運行既獲Qt 4.3.7和OpenCV 2.3使用Qt啓用。當我開始使用一個窗口:的OpenCV 2.3使用Qt 4.3.7

cvNamedWindow("video", 0); 

我成功加載一個完整的Qt界面!精彩:)

但是!當我使用命令

void callbackButton(int state, void* userdata){ 
int x; 
x=3; 
} 

cvCreateButton(nameb2,callbackButton,nameb2,CV_CHECKBOX,0); 

我得到錯誤信息

error LNK2001: unresolved external symbol _cvCreateButton 

我不明白作爲Qt的接口已經有很多關於它的按鈕?有人能解釋我從包含什麼可能會導致這個失蹤?

謝謝!

回答

0

這是一個鏈接錯誤。 嘗試將opencv .lib文件(或文件)添加到項目庫路徑中。 這可能有所幫助:VS2010 OpenCV

編輯

精製問題:即使添加任何OpenCV的 libary到您的項目鏈接將會失敗。

原因:符號往往是簡單地在庫中不存在。

解決方案:必須更改一些設置和編譯他們自己。

參見:openCV 2.2 createButton LNK 2019 error in Visual Studio 2010

0

您使用來電cvCreateButton了錯誤的參數。根據文檔here功能的簽名是

cvCreateButton(const char* button_name CV_DEFAULT(NULL), CvButtonCallback on_change CV_DEFAULT(NULL), void* userdata CV_DEFAULT(NULL), int button_type CV_DEFAULT(CV_PUSH_BUTTON), int initial_button_state CV_DEFAULT(0) 

和樣品電話是:

cvCreateButton(NULL,callbackButton); 
cvCreateButton("button2",callbackButton,NULL,CV_CHECKBOX,0); 
cvCreateButton("button3",callbackButton,&value); 
cvCreateButton("button5",callbackButton1,NULL,CV_RADIOBOX); 
cvCreateButton("button6",callbackButton2,NULL,CV_PUSH_BUTTON,1); 

和回調函數的聲明必須是:

CV_EXTERN_C_FUNCPTR(*CvButtonCallback)(int state, void* userdata)); 

你得到鏈接錯誤而不是編譯器錯誤,因爲cvCreateButton具有外部「C」鏈接 - 這意味着在編譯時不能檢查參數。

0

第三個參數必須是一個void*。改爲:

cvCreateButton(nameb2,callbackButton,NULL,CV_CHECKBOX,0); 

它會工作。

編輯

聲明上面給出錯誤。 第三個需要的參數是「void *」 - 這與任何東西都是兼容的,因此C和C++都不應該對你提供的內容有任何問題。你不能提出一個鏈接器錯誤。

通過編碼可以引發鏈接器錯誤的唯一原因是在C++中沒有使用原型(忘記使用頭文件),然後C++自己創建了一個錯位的名稱,它不會成爲任何庫的一部分。在這種情況下,編譯器會首先在編譯時告訴您缺少原型(對於C和C++) - 然後鏈接器可能會引發錯誤(僅適用於C++)。

如果你沒有看到編譯器的原型警告,那就不是你的問題。

0

我通過調用函數cv :: createButton而不是cvCreateButton(如果我正確調用OpenCV2中的方法)來解決此問題。