OpenCV 2.3 с Qt 4.3.7 - PullRequest
       6

OpenCV 2.3 с Qt 4.3.7

0 голосов
/ 02 августа 2011

Я успешно собрал и запустил Qt 4.3.7 и OpenCV 2.3 с включенным Qt.Когда я запускаю окно, используя:

cvNamedWindow( "video", 0 );

, я успешно загружаю полный интерфейс Qt!замечательно :) 1004

Однако !!когда я использую команду

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

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

, я получаю сообщение об ошибке

error LNK2001: unresolved external symbol _cvCreateButton

Я не понимаю, так как на интерфейсе Qt уже есть много кнопок?Может кто-нибудь объяснить, что мне не хватает во включении, которое может вызвать это?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 04 июля 2014

Я решил эту проблему, вызвав функцию cv :: createButton вместо cvCreateButton (если я правильно выбрал способ вызова методов в OpenCV2).

0 голосов
/ 02 августа 2011

Вы используете неправильные параметры для вызова cvCreateButton. Согласно документации здесь подпись функции

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 голосов
/ 13 октября 2011

Третий аргумент должен быть void*. Изменить на:

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

и это будет работать.

Редактировать

В приведенном выше утверждении произошла ошибка. Третий необходимый аргумент - это «void *» - это совместимо с чем угодно, и поэтому ни C, ни C ++ не должны иметь проблем с тем, что вы предоставляете. Вы не можете вызвать ошибку компоновщика с этим.

Единственная причина, по которой ошибка компоновщика может быть вызвана кодированием, - это когда вы не используете прототипы (забыли использовать файл заголовка) в C ++, а затем C ++ самостоятельно создает искаженное имя, которое не будет частью какой-либо библиотеки. В таком случае компилятор сначала сообщит вам с предупреждением во время компиляции, что вам не хватает прототипа (для C и C ++), а затем компоновщик, вероятно, выдаст ошибку (только для c ++).

Если вы не видите предупреждение прототипа от компилятора, тогда это не ваша проблема.

0 голосов
/ 02 августа 2011

Это ошибка связи. Попробуйте добавить файл opencv .lib (или файлы) в путь к библиотекам проекта. Это может помочь: VS2010 OpenCV .

Редактировать

Уточненная проблема: даже при добавлении какой-либо библиотеки OpenCV в ваш проект, ссылка не будет установлена.

Причина: символ часто просто отсутствует в библиотеках.

Решение: Вы должны изменить несколько настроек и скомпилировать их самостоятельно.

См. Также: ошибка openCV 2.2 createButton LNK 2019 в Visual Studio 2010

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...