在 qt 控制台应用程序中未定义对 'vtable for myObj' 的引用 - 信号和插槽

undefined reference to `vtable for myObj' in qt console application - signals and slots

本文关键字:引用 myObj 信号 插槽 for vtable 未定义 控制台 qt 应用程序      更新时间:2023-10-16

我需要从QProcess捕获发射的信号以进行测试。

由于我使用的是控制台应用程序,因此我决定在我的主文件中创建一个名为 myObj 的类.cpp主要使用以下示例:

#include <QCoreApplication>
#include <QLoggingCategory>
#include <QTextStream>
#include <QProcess>
#include <QString>
#include <QVariant>
#include <QDebug>
#include <QObject>
class myObj : public QObject
{
    Q_OBJECT
public:
    myObj(QObject *parent = 0);
//    virtual ~Communicate();
    ~myObj();
public slots:
    void registerFinished(int signal);
    void registerAboutToClose();
    void registerChannelReadyRead(int signal);
    void registerReadChannelFinished();
    void registerReadyRead();
    void registerReadyReadStandardOutput();
    void registerStarted();
};
myObj::myObj(QObject *parent)
    : QObject(parent)             <--- LINE 72 Error
{
}
//virtual myObj::~Communicate(){
//}
myObj::~myObj(){                  <--- LINE 81 Error
}
void myObj::registerFinished(int signal){
    qDebug() << "exit code = " << QString::number(signal);
}
void myObj::registerAboutToClose(){
    qDebug() << "aboutToClose";
}
void myObj::registerChannelReadyRead(int signal){
    qDebug() << "channelReadyRead = " << QString::number(signal);
}
void myObj::registerReadChannelFinished(){
    qDebug() << "readChannelFinished";
}
void myObj::registerReadyRead(){
    qDebug() << "exit code";
}
void myObj::registerReadyReadStandardOutput(){
    qDebug() << "exit code";
}
void myObj::registerStarted(){
    qDebug() << "started";
}
myObj *myO;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    myO = new myObj();
    //....
}

问题:

main.cpp:72:错误:未定义对"vtable for myObj"的引用

main.cpp:81:错误:未定义对"vtable for myObj"的引用

我已经查看了许多SO页面,例如此处,此处和此处以及其他各种页面,但没有找到解决方案

我尝试/做过:

  • 添加了Q_Object宏
  • 冉冉
  • 重建
  • 已检查 #include

.pro 文件

QT += core
QT -= gui
CONFIG += c++11
TARGET = serv_app
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp

有什么建议吗?

您有两个选择:

  • @eyllanesc解决方案肯定有效。
  • 在函数之前或之后添加行#include "main.moc" main()

当您将类放入其自己的头文件中时,qmake将生成正确的moc文件。

但是当你把类放到一个.cpp文件中时,除非你把我之前说的那行放进去,否则不会生成moc代码。

更新 #1

在关于编写单元测试的Qt教程中,我们可以找到以下信息:

注意,如果既声明又实现我们的测试 类都在一个.cpp文件中,我们还需要包含生成的 MOC 文件以使Qt的内省工作。

所以这是我们需要包含moc文件的另一个例子。