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)

在 Visual Studio 2010 中为新 QOBJECT 文件生成 MOC

如何处理主队列上的多个 moc

Qt Meta Object system 学习

Qmake 5.3:定义全局变量