【问题标题】:Qt "signal undefined reference error" after inheriting from QObject从QObject继承后的Qt“信号未定义引用错误”
【发布时间】:2013-10-10 23:17:35
【问题描述】:

我最近需要给一个类添加一个信号,所以我把这个类改成继承自QObject,并将Q_OBJECT宏添加到类定义中。由于这样做,我在下面的类行中收到 "signal undefined reference error for 'vtable for CLICommand'" 错误:

// File clicommand.h
#include <QString>
#include <QStringList>
#include <QTcpSocket>
#include "telnetthread.h"
class CLICommand : public QObject
{
Q_OBJECT
public:
    CLICommand(TelnetThread *parentTelnetThread);
signals:
    void signal_shutdown_request(); 
private:
    TelnetThread *m_parentTelnetThread;

第二个错误"signal undefined reference error for 'vtable for CLICommand'" 在下面一行(初始化成员变量):

// File clicommand.cpp
#include <QDebug>
#include <QTcpSocket>
#include <QTextStream>
#include "version.h"
#include "clicommand.h"
#include "telnetthread.h"
#include "logger.h"
CLICommand::CLICommand(TelnetThread *parentTelnetThread)
  : m_parentTelnetThread(parentTelnetThread)
{
}

这里就是我发出信号的地方。发射行生成错误undefined reference to `CLICommand::signal_shutdown_request()'

// file shutdown_clicommand.cpp
#include <QIODevice>
#include "clicommand.h"
#include "logger.h"
#include "version.h"
void CLICommand::execute_shutdown(const QStringList &commandLineFragments)
{
    emit signal_shutdown_request();
}

我已经阅读了很多关于这个主题的帖子,但似乎没有一个适用。我什至尝试过 clean/rebuildall。我没有使用 boost 或其他库...只是 QT 5

谁能告诉我我做错了什么?


解决方案:在 QT Creator 中,右键单击项目,选择 RUN QMAKE,然后全部重建。其他关于运行 REBUILD ALL 的帖子不正确......它自己不会运行 qmake。

【问题讨论】:

    标签: c++ qt qtcore qt-signals moc


    【解决方案1】:

    您需要确保(重新)运行“moc”以进行这些更改。您似乎错过了生成的 moc 文件,或者该文件已过时,因此未包含对当前状态的正确引用。

    添加 Q_OBJECT 宏时,QtCreator 无法正确重新运行 qmake。这是一个长期存在的问题,因此您需要手动重新运行它。

    https://bugreports.qt.io/browse/QTCREATORBUG-231

    【讨论】:

    • 也许在使用 Qt Creator 时显式重新运行 qmake 的最简单方法是直接转到构建并删除 Makefile。然后,在下一个“全部构建”操作中,Qt Creator 重新生成它,这样Q_OBJECT 更改相关链接错误就会消失。
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2011-08-16
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多