【问题标题】:qt - undefined reference to `vtable for myObj' in qt console application - signals and slotsqt - 在 qt 控制台应用程序中未定义对 `vtable for myObj' 的引用 - 信号和插槽
【发布时间】:2017-01-25 02:58:05
【问题描述】:

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

由于我使用的是控制台应用程序,我决定在我的 main.cpp 文件中创建一个名为 myObj 的类,主要使用 this example

#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: error: undefined reference to `vtable for myObj'

main.cpp:81: error: undefined reference to `vtable for myObj'

我查看了许多 SO 页面,例如 hereherehere 以及其他各种页面,但尚未找到解决方案

我已经尝试/完成了:

  • 添加了 Q_Object 宏
  • 运行 qmake
  • 重建
  • 检查了#include

.pro 文件

QT += core
QT -= gui

CONFIG += c++11

TARGET = serv_app
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

有什么建议吗?

【问题讨论】:

标签: c++ qt signals-slots qobject


【解决方案1】:

你有两个选择:

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

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

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

更新 #1

Qt tutorial about writing a Unit Test我们可以找到以下信息:

注意,如果我们的测试的声明和实现 类在 .cpp 文件中,我们还需要包含生成的 moc 文件以使 Qt 的自省工作。

这是另一个需要包含moc 文件的示例。

【讨论】:

  • 必须将#include "main.moc" 放在main 方法的上方,第一次放置时也找不到“main.moc”。构建后,此消息消失了。
  • 是的。您需要清理构建目录或重新运行 qmake。
  • 在我的个人资料中,您有一个指向我主页的链接。联络我。但我认为在 SO 中发布问题也是一个好主意。
  • 如果您有兴趣看一看,将非常非常非常感谢! -> stackoverflow.com/questions/41848939/…
猜你喜欢
  • 2014-01-13
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多