Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt]problème signaux et slots

conflit entre le moc et la macro Q_OBJECT

27 février 2010 à 18:34:10

Bonsoir,

Voilà, je ne comprends vraiment pas l'erreur à la compilation quand j'inclus la macro Q_OBJECT dans un de mes projets. J'ai pensé à faire un qmake-qt4 (je tourne sous linux), make clean, j'ai cherché sur des forums mais leurs solutions ne me conviennent pas.


-DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o moc_application.o moc_application.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o moc_application.o moc_application.cpp
g++ -Wl,-O1 -o mariodrem arena.o home.o main.o QSFMLCanvas.o moc_application.o    -L/usr/lib -lsfml-graphics -lsfml-window -lsfml-system -lQtGui -lQtCore -lpthread
moc_application.o: In function `non-virtual thunk to Application::~Application()':
moc_application.cpp:(.text+0x90): multiple definition of `non-virtual thunk to Application::~Application()'
main.o:main.cpp:(.text+0x30): first defined here
moc_application.o: In function `Application::~Application()':
moc_application.cpp:(.text+0xa0): multiple definition of `Application::~Application()'
main.o:main.cpp:(.text+0x40): first defined here
moc_application.o: In function `Application::~Application()':
moc_application.cpp:(.text+0x100): multiple definition of `Application::~Application()'
main.o:main.cpp:(.text+0xa0): first defined here
moc_application.o: In function `non-virtual thunk to Application::~Application()':
moc_application.cpp:(.text+0x160): multiple definition of `non-virtual thunk to Application::~Application()'
main.o:main.cpp:(.text+0x100): first defined here
moc_application.o: In function `Application::~Application()':
moc_application.cpp:(.text+0x170): multiple definition of `Application::~Application()'
main.o:main.cpp:(.text+0x110): first defined here
moc_application.o: In function `Application::Application()':
moc_application.cpp:(.text+0x1d0): multiple definition of `Application::Application()'
main.o:main.cpp:(.text+0x170): first defined here
moc_application.o: In function `Application::Application()':
moc_application.cpp:(.text+0x7e0): multiple definition of `Application::Application()'
main.o:main.cpp:(.text+0x780): first defined here
collect2: ld a retourné 1 code d'état d'exécution
make: *** [mariodrem] Erreur 1



De plus, un autre projet qui utilise Q_OBJECT se compile parfaitement.

Une idée?
  • Partager sur Facebook
  • Partager sur Twitter
27 février 2010 à 18:45:40

Le compilateur te dit que tu as défini plusieurs fois le destructeur. Il faudrait que tu poste le code de Application.h et Application.cpp.
  • Partager sur Facebook
  • Partager sur Twitter
27 février 2010 à 18:58:37

Ok, pourtant mon constructeur n'est pas défini.
J'ai trouvé la solution, mais par contre je ne la comprend pas: Par fainéantise, je n'avais pas fait de header, et tout était dans le Application.cpp. Le problème se résout après l'ajout de Application.hpp.
Pourquoi la macro Q_OBJECT ne fonctionne pas sans header?
  • Partager sur Facebook
  • Partager sur Twitter
27 février 2010 à 18:59:50

Il faut mettre cette macro dans le headers, lors de la definition de la classe.
  • Partager sur Facebook
  • Partager sur Twitter
27 février 2010 à 19:00:46

tu n'aurai pas inclus un fichier 2X?
  • Partager sur Facebook
  • Partager sur Twitter
27 février 2010 à 19:29:55

Citation : merodrem

Pourquoi la macro Q_OBJECT ne fonctionne pas sans header?


Si, elle fonctionne, mais autrement, il faut mettre un include spécifique dans le .cpp qui n'a pas de header séparé pour une ou plusieurs classes avec Q_OBJECT:
//nom du fichier actuel avec .moc à la place de .cpp
#include "Application.moc"
Et ce juste après la déclaration de la ou des classes avec Q_OBJECT.

Sans cet #include, Application.moc n'existe pas, et avec il est généré.
  • Partager sur Facebook
  • Partager sur Twitter
12 septembre 2024 à 15:04:43 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


12 septembre 2024 à 15:11:15

@JeffDiffo Bonjour, ce sujet date de 2010, merci de ne pas déterrer d'ancien sujet pour une nouvelle question, créer votre propre sujet. C'est un sujet par problématique.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

Je ferme ici.

  • Partager sur Facebook
  • Partager sur Twitter