QMake在moc文件上的多个定义
Posted
技术标签:
【中文标题】QMake在moc文件上的多个定义【英文标题】:QMake multiple definitions on moc file 【发布时间】:2014-04-20 18:41:12 【问题描述】:我在 QT 中的多个定义遇到了很多麻烦。对于普通类,在我的整个库中,我只是将实现和头文件放在同一个 hpp 文件中。 我正在尝试转换 QObject 中的普通类,因此我可以将其用作工作线程来连接其他 QThread。在我将我的类转换为 QObject 之后,我遇到了许多多重定义问题。假设我的班级现在看起来像这样:
#ifndef MYCLASS_HPP
#define MYCLASS_HPP
#include "common.hpp"
#include <qtGui>
namespace Bial
class Image;
class Myclass : QObject
Image *img;
signal:
void mySignal();
public:
void f();
#include "Image.hpp"
namespace Bial
void Myclass::f()
#endif //MYCLASS_HPP
MyClass 是 Platefinder 类的简化版。泰语太大了,放不下; 该问题出现在此类的 moc_platefinder.o 文件中以及我整个库的许多功能中。共 289 个多重定义问题:
mainwindow.o:/home/lellis/Dropbox/Lellis_Diet/bin/../diet/inc/../bial/File.hpp:1677:首先在这里定义
Entire compiler output
对不起,我的英语不好。
【问题讨论】:
【参考方案1】:您不应该在此处包含“Q_OBJECT”(http://qt-project.org/doc/qt-4.8/signalsandslots.html) 吗? :
class Myclass : QObject
Q_OBJECT // <-- here
signal:
void mySignal();
public:
void f();
Image *img;
编辑:通常“...的多个定义”可以用“静态”来修复(即“静态无效f()”)
编辑:你看过这里吗? Multiple definitions error: one in my file and one in the moc file.
【讨论】:
对不起,我试图简化课程以提出问题,但忘记包含 Q_OBJECT 标记。多重定义问题发生在这个名为 PlateFinder 的类的许多成员类中,但它发生在许多其他类中。我有 289 个这样的多重定义问题:/ 我曾经遇到过同样的问题,我想我必须重新编译项目(不确定)。编辑:查看编辑 我的问题不同,我知道这个信号是在 moc 文件中实现的。我试图找到一种方法来编译这个程序而不使这 289 个函数内联。不幸的是我现在必须这样做。坦克寻求帮助:)【参考方案2】:我没有尝试过我的答案,但是:
-
#include QObject 没有意义;你可以改用#include;
在 QObject 派生的类中,您必须在其定义中添加 Q_OBJECT 宏;
#endif 出现在错误的位置;
然后,您的代码应该如下所示:
#ifndef MYCLASS_HPP
#define MYCLASS_HPP
#include "common.hpp"
#include <QtGui>
namespace Bial
class Image;
class Myclass : QObject
Q_OBJECT
Image *img;
signal:
void mySignal();
public:
void f();
#endif //MYCLASS_HPP
#include "Image.hpp"
namespace Bial
void Myclass::f()
【讨论】:
我现在尝试这样做,但没有成功。我试图简化我的课程以提出问题,但忘记在 MyClass 标题中添加 Q_OBJECT 标记。 #endif 标记最后是因为标头和实现在同一个文件中,并且在所有其他类中都可以正常工作。即使更改#endif 标记位置和包括qtGUI 我也有同样的问题。 moc 创建 moc_platefinder.cpp 文件后,QT 编译器显示 289 多定义问题。以上是关于QMake在moc文件上的多个定义的主要内容,如果未能解决你的问题,请参考以下文章
在visual studio 2010中为新的QOBJECT文件生成MOC
the Meta-Object Compiler (moc)