我有代码:
#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
答案 0 :(得分:10)
您必须使用moc生成标头。这可以使用Qt构建系统自动完成。您应该使用qmake文件而不是直接使用gcc。
此外,您应该将声明和代码分隔为头文件和cpp文件。
以下是moc的作用说明:http://doc.qt.nokia.com/latest/moc.html
在stackoverflow上有一个类似的问题(有答案): Undefined reference to vtable. Trying to compile a Qt project
答案 1 :(得分:6)
您需要在源文件的底部有一行:
#include "main.moc"
那是因为class Thread
的声明不在标题中 - 它在.cpp文件中。因此默认情况下moc
不会在其上运行。添加该行有两件事:
qmake
和moc
发信号通知moc
必须处理.cpp文件moc
生成的内容被编译步骤因此,在添加该行之后,您需要重新运行qmake
,以便更新makefile以使main.moc
生成。
通常,moc
针对头文件运行并创建包含在构建中的.cpp文件(qmake
看到此内容)。这个'技巧'导致moc
也在问题上运行.cpp文件(并且编译了moc
生成的代码)。
在main.moc
末尾添加main.cpp
的替代方法是将class Thread
的定义移至.h头文件和#include
。如果定义位于标题qmake
中,moc
应自动处理。
答案 2 :(得分:0)
我认为 qmake系统要求您的头文件直接包含在内。我添加了include之前,我的MOC无法生成。
答案 3 :(得分:-1)
简单地将字符串添加到.pro文件中。这对我有同样的问题帮助
INSTALLS += target
请参阅queudcustomtype示例。