2011-08-02 5 views
0

J'ai réussi à générer et à exécuter à la fois Qt 4.3.7 et OpenCV 2.3 avec Qt activé. Lorsque je démarre une fenêtre en utilisant:OpenCV 2.3 avec Qt 4.3.7

cvNamedWindow("video", 0); 

J'ai réussi à charger une interface Qt complète! merveilleux :)

Cependant !! quand j'utilise la commande

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

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

Je reçois le message d'erreur

error LNK2001: unresolved external symbol _cvCreateButton 

Je ne comprends pas que l'interface Qt a déjà beaucoup de boutons sur elle? quelqu'un pourrait expliquer s'il vous plaît ce que je suis absent de l'inclusion qui pourrait causer cela?

Merci!

Répondre

0

Ceci est une erreur de liaison. Essayez d'ajouter le fichier opencv .lib (ou les fichiers) au chemin d'accès aux bibliothèques du projet. Cela peut aider: VS2010 OpenCV.

Modifier

problème raffiné: Même si l'ajout d'une OpenCV libary à votre projet la mise en relation échouera.

Raison: Le symbole n'existe souvent pas dans les bibliothèques.

Solution: Vous devez modifier quelques paramètres et les compiler vous-même.

Voir aussi: openCV 2.2 createButton LNK 2019 error in Visual Studio 2010

0

Vous utilisez les mauvais paramètres pour appeler à cvCreateButton. Selon la documentation here la signature de la fonction est

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) 

et appels exemples sont:

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); 

et la déclaration de la fonction de rappel doit être:

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

Vous obtenez une erreur de liaison et pas une erreur de compilation car cvCreateButton a un lien externe "C" - ce qui signifie que les paramètres ne peuvent pas être vérifiés au moment de la compilation.

0

Le troisième argument doit être un void*. Remplacez par:

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

et cela fonctionnera.

Modifier

La déclaration a été faite ci-dessus une erreur. Le troisième argument nécessaire est un "void *" - ceci est compatible avec n'importe quoi et donc ni C ni C++ ne devraient avoir un problème avec ce que vous fournissiez. Vous ne pouvez pas déclencher une erreur de lien avec cela.La seule raison pour laquelle une erreur de lien peut être déclenchée par le codage est lorsque vous n'utilisez pas de prototypes (ou que vous avez oublié d'utiliser le fichier d'en-tête) en C++ et que C++ crée un nom modifié qui n'appartient à aucune bibliothèque. . Dans un tel cas, le compilateur vous indiquera d'abord avec un avertissement au moment de la compilation qu'il vous manque le prototype (pour C et C++) - et alors le lieur va probablement déclencher une erreur (pour C++ seulement).

Si vous ne voyez pas d'avertissement prototype du compilateur, ce n'est pas votre problème.

0

J'ai résolu ce problème en appelant la fonction cv :: createButton au lieu de cvCreateButton (qui est si je suis correct la façon d'appeler des méthodes dans OpenCV2).

Questions connexes