【发布时间】:2013-01-11 09:45:26
【问题描述】:
可能重复:
Undefined reference to vtable. Trying to compile a Qt project
这里是代码
#include <iostream>
#include <QApplication>
#include <QTimer>
class myClass : public QObject {
Q_OBJECT
public:
QTimer *timer;
myClass(){
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(mySlot()));
timer->start(1000);
}
public slots:
void mySlot() {
std::cout << "Fire" << std::endl;
}
};
int main() {
std::cout << "Hello, world";
myClass atimer;
return 0;
}
除了报错,还有两点不明白:
为什么宏后面没有分号,在本例中为 Q_OBJECT。它似乎不遵循 C++ 语法,但人们编写这样的代码。
“public slots”是Qt创建的修饰符,但是gcc编译器怎么还能看懂。 Qt 之类的 IDE 如何修改语言的标准语法?
【问题讨论】:
-
宏只是一个文本替换,所以它可能包含分号,你不必写。
-
事实上,gcc 编译器不理解
public slots(对他来说只是public),但是Qt 的moc 编译器可以。这就是为什么您需要在使用 gcc 编译之前运行它并在之后使用 gcc 编译生成的 moc_....cpp 的原因。最后,这就是为什么一个简单的 gcc 调用对于 Qt 程序来说是不够的(并且可能会导致编译器错误),你应该设置一个正确的 qmake 项目。