【问题标题】:Generated moc names are not correct生成的 moc 名称不正确
【发布时间】:2012-07-25 13:25:48
【问题描述】:

我正在开发一个使用 cmake 的基于 Qt 的项目。我生成的所有moc文件都命名为*.moc,但我有一些文件,它们生成的moc文件的名称为moc_*.cpp,而不是*.moc。为什么会发生这种情况以及如何修复这些文件。

编辑:

  • 我想说这些类是从 QObject 继承的,并且具有 Q_OBJECT 和 Q_DECLARE_PUBLIC 宏,除非它们有 .moc,否则它们不会与我一起编译。

  • 我必须在我的 .cpp 文件中包含 .moc 文件。

- 让我发疯的事情是我有一个相同的类(与我的类相同的实现)生成一个 .moc 但我的类生成 moc_*.cpp。

【问题讨论】:

  • 您的文件属于那些名为*.moc 的moc 文件,它们是否由*.h*.cpp 组成? *.moc 文件(不是moc_*.cpp 文件),它们是放在构建目录还是源目录中?
  • 只是为了在我的 cmakelist 文件中进行解释,我添加了 .cpp 文件,它使 .h 和 .cpp 编译良好,在我的 .cpp 中,我只包含了没有 .h 的 .moc 文件,moc_ *.cpp 在生成 .moc 的同一构建目录中生成。

标签: qt qt4 cmake qobject metaobject


【解决方案1】:

您不必在每次使用 Q_OBJECT 时都包含 *.moc 文件。 .moc 文件仅为在 .cpp 文件中声明的类生成。在其他情况下, moc 会生成 moc_*.cpp ,其中包含您自己的基于 Q_OBJECT 的类。你没有什么可担心的。从您的 cpp 文件中删除 *.moc 包含。例如:

main.cpp

class E: public QObject
{
    Q_OBJECT
};

moc 将生成 main.moc 文件以包含在 main.cpp 中

另一个例子

类.h

class E: public QObject
{
     Q_OBJECT
public:
     void member();
};

class.cpp

#include "class.h"

void E::member()
{
}

moc 将生成 moc_class.cpp,其中包含 class.h 并且是单独的编译单元

【讨论】:

  • 感谢您的回答,但编译器给了我“未定义的引用”我的构造函数和这个类的函数。没有 Q_OBJECT 宏,它编译得很好。你怎么看。
  • 另外我想说的是,在我的项目中有另一个类具有类似的实现,它编译良好并生成一个.moc。我不知道为什么这个类会生成 moc_*.cpp。
  • 抱歉,我不知道这种行为的原因。我记得我使用 Qt 和 cmake 没有任何问题。你在这里做错了什么。你有 Qt cmake 模块吗?
  • 其余的项目类表现得很好,我的问题是为什么这个类与其他没有生成 .moc 文件的精细类非常相似。
  • 因为正如我所说,它应该(并且确实)生成 moc_*.cpp 应该自动添加为源文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2013-05-25
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
相关资源
最近更新 更多