Qt metaObject linker problem

Après avoir intégré Qt à Vs et essayé de comstackr un fichier .pro, les erreurs suivantes se produisent:

Error 9 error LNK2001: unresolved external symbol "public: virtual int __thiscall Multiplication_dialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Multiplication_dialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z) Error 7 error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Multiplication_dialog::metaObject(void)const " (?metaObject@Multiplication_dialog@@UBEPBUQMetaObject@@XZ) Error 8 error LNK2001: unresolved external symbol "public: virtual void * __thiscall Multiplication_dialog::qt_metacast(char const *)" (?qt_metacast@Multiplication_dialog@@UAEPAXPBD@Z) 

Que faire avec ceci?

Vous obtenez généralement ces erreurs lorsque le fichier moc_foo.cpp pour foo.h (qui contient votre classe marquée avec Q_OBJECT) n’est pas compilé / lié dans votre projet.

Pour faire fonctionner un projet Qt dans VS, vous devez soit

  1. Créez un fichier .vcproj avec ‘qmake -tp vc’ ou
  2. Utilisez le complément Qt Visual Studio qui gère automatiquement toute la magie de moc (ne fonctionne pas avec les versions de VC Express).

Lorsque vous utilisez le complément, vous pouvez déclencher la création du fichier moc_foo.cpp en

  • Assurez-vous que le fichier d’en-tête de l’object en question apparaît dans le projet VS
  • Élément de liste
  • supprime toutes les occurrences de Q_OBJECT du fichier d’en-tête de Multiplication_dialog.
  • sauvegarder le fichier
  • rajoutez Q_OBJECT
  • sauvegarder le fichier

Vous devriez maintenant avoir deux versions de moc_multiplication_dialog.cpp dans votre dossier “Generated Files” de l’Explorateur de solutions. Un pour “Debug” et un pour “Release”. Assurez-vous que l’un de ces fichiers n’est pas exclu de la construction.

J’ai rencontré la même erreur de l’éditeur de liens aujourd’hui, mais c’était à cause d’un petit glissement:

J’ai ajouté manuellement des fichiers cpp / ui à mon projet, mais j’ai oublié d’append explicitement le fichier d’en-tête en tant que fichier d’en-tête. Maintenant, lors de la compilation, un message d’erreur similaire à celui ci-dessus est apparu et les fichiers moc _ *. Cpp n’ont pas été générés dans le répertoire debug (ou release) de la construction. Ce n’était pas une erreur si évidente, qmake ne s’est pas plaint et à part le message de l’éditeur de liens, je n’ai pas eu d’erreur.

Donc, si quelqu’un rencontre à nouveau le même problème (ou fait la même erreur copy & pase): assurez-vous que les fichiers d’en-tête ont également été ajoutés à votre fichier de projet

Citate du livre “Programmation d’interface graphique C ++ avec Qt 4” (page 19): Pour que moc fonctionne correctement, vous devez placer la définition de la classe dans un fichier d’en-tête, séparé du fichier d’implémentation. Vous devez donc écrire 2 fichiers pour votre classe: Multiplication_dialog.h et Multiplication_dialog.cpp! Et vous devez recréer le makefile!

Eh bien, aujourd’hui, j’ai probablement rencontré le même problème. Je sais que le fil est assez vieux. Mais cela peut encore aider quelqu’un.

Dans mon cas, moc a généré les fichiers moc_ .cpp , mais VC ne sait pas qu’il doit également les comstackr. J’ai donc ajouté manuellement ces fichiers générés par moc pour qu’il soit compilé. et cela a fonctionné.

Je travaille actuellement avec VS 2013 avec le complément QT 5.4. La création de projets avec le complément facilite la tâche car le mocage est automatiquement géré. Pour éviter les problèmes d’erreur de l’éditeur de liens avec les problèmes Qt metaObject:

  1. Mettez en commentaire toutes les instances de Q_OBJECT dans tous les fichiers d’en-tête qui le contiennent dans les déclarations de classe.

  2. Construire la solution

  3. Décommentez toutes les instances de Q_OBJECT dans les fichiers d’en-tête.

  4. Reconstruisez la solution. C’est ici que tous les fichiers cpp et tous les en-têtes sont recompilés avec le moc ‘automatiquement fait. Les erreurs de l’éditeur de liens sont à leur tour sockets en charge.

Le même problème s’est produit lorsque j’ai utilisé Qt Addin pour VS. J’ai vu que les fichiers moc are not included into project après la construction. Je les ai inclus dans le projet, ces erreurs ont disparu.