【问题标题】:qt error: undefined reference to `vtable for Thread'qt 错误:未定义对 `vtable for Thread' 的引用
【发布时间】:2011-06-16 06:02:51
【问题描述】:

我有代码:

#include <iostream>
#include <QThread>
#include <unistd.h>
#include <stdlib.h>
#include <QApplication>


using std::cerr;
using std::endl;

class Thread : public QThread
{
    Q_OBJECT
public:
    Thread();
    ~Thread();
    void setMessage(const QString &_message);
    void stop();
protected:
    void run();
private:
    QString message;
    volatile bool stopped;
};

Thread::Thread()
{
    stopped = false;    
    run();
}

Thread::~Thread()
{

}


void Thread::run()
{
    while(!stopped){
        cerr << qPrintable(message);
        sleep(1);
    }
        stopped = false;
        cerr << endl;
}

void Thread::stop()
{
    stopped = true; 
}

void Thread::setMessage(const QString &_message)
{
    message = _message; 
}

int main(int argc,char *argv[])
{
    QApplication app(argc, argv);
    Thread *A,*B;
    A = new Thread();
    B = new Thread();
    A->setMessage("Thread A\n");
    B->setMessage("Thread B\n");
//.run();
//.run();
    sleep(10);
    A->stop();
    B->stop();
    return 0;
}

我有错误

g++ -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-O1 -o tmp main.o    -L/usr/lib -lQtGui -lQtCore -lpthread 
main.o: In function `Thread::~Thread()':
main.cpp:(.text+0xa): undefined reference to `vtable for Thread'
main.o: In function `Thread::Thread()':
main.cpp:(.text+0x1da): undefined reference to `vtable for Thread'
collect2: ld returned 1 exit status
make: *** [tmp] Error 1

【问题讨论】:

标签: c++ multithreading qt


【解决方案1】:

您必须使用 moc 生成标头。这可以通过 Qt 构建系统自动完成。与其直接使用 gcc,不如使用 qmake 文件。

你也应该把声明和代码分成头文件和cpp文件。

这里是 moc 功能的描述:http://doc.qt.nokia.com/latest/moc.html

在 stackoverflow 上还有一个类似的问题(有答案): Undefined reference to vtable. Trying to compile a Qt project

【讨论】:

    【解决方案2】:

    您需要在源文件的底部有一行:

    #include "main.moc"
    

    这是因为 class Thread 的声明不在标头中 - 它在 .cpp 文件中。所以默认情况下moc 不会在它上面运行。添加该行有两件事:

    • 它向qmakemoc 发出信号,表明moc 必须处理.cpp 文件
    • 它会导致 moc 生成的东西被编译步骤拉入

    因此,在添加该行之后,您需要重新运行 qmake,以便它可以更新 makefile 以生成 main.moc

    通常,moc 针对头文件运行并创建包含在构建中的 .cpp 文件(qmake 对此负责)。这个“技巧”导致moc 也可以在有问题的 .cpp 文件上运行(并编译 moc 生成的代码)。

    main.cpp 末尾包含main.moc 的另一种方法是将class Thread 的定义移动到.h 头文件和#include。如果定义在标题中,qmakemoc 应该会自动处理。

    【讨论】:

      【解决方案3】:

      认为 qmake 系统要求你的头文件直接包含。在我添加包含之前,我的无法生成 moc。

      【讨论】:

        【解决方案4】:

        简单地将字符串添加到 .pro 文件。这对我解决同样的问题有帮助

        INSTALLS += target
        

        参见 queudcustomtype 示例。

        【讨论】:

        • 这似乎无法回答问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        • 2021-11-30
        • 2011-02-03
        • 2011-12-01
        相关资源
        最近更新 更多