Qt“你好世界”GUI应用程序没有链接?

时间:2013-01-11 14:31:15

标签: c++ qt

  

可能重复:
  Qt: Signals and slots Error: undefined reference to `vtable for

这里我们有test.cpp:

#include <QApplication>
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

单独放在新目录中:

$ qmake -project
$ qmake
$ make

不起作用:

test.o: In function `MainWindow::~MainWindow()':
test.cpp:(.text._ZN10MainWindowD2Ev[_ZN10MainWindowD5Ev]+0x3): undefined reference to `vtable for MainWindow'
test.cpp:(.text._ZN10MainWindowD2Ev[_ZN10MainWindowD5Ev]+0xb): undefined reference to `vtable for MainWindow'
test.o: In function `main':
test.cpp:(.text.startup+0x48): undefined reference to `vtable for MainWindow'
test.cpp:(.text.startup+0x51): undefined reference to `vtable for MainWindow'
test.o: In function `MainWindow::~MainWindow()':
test.cpp:(.text._ZN10MainWindowD0Ev[_ZN10MainWindowD0Ev]+0x7): undefined reference to `vtable for MainWindow'
test.o:test.cpp:(.text._ZN10MainWindowD0Ev[_ZN10MainWindowD0Ev]+0xf): more undefined references to `vtable for MainWindow' follow
collect2: error: ld returned 1 exit status
make: *** [tmp] Error 1

通常,这样的错误要么是因为没有调用moc,要么是因为未实现的虚方法。

moc应该由qmake自动调用,而afaik QMainWindow没有任何纯虚方法 - 所以这里有什么问题?

当我删除Q_OBJECT时,它可以工作。为什么是这样?发生了什么事?

我看到Q_OBJECT告诉moc生成该对象的信号/插槽元数据,为什么在这种情况下不能这样做呢?

更新

解决方案是在类下面添加#include "test.moc"

#include <QApplication>
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT
};

#include "test.moc"  // <----------- HERE

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:10)

这是因为您在.cpp文件中声明了该类。把它放在一个单独的.h标题中。

默认情况下,不会为源文件调用MOC,仅针对标头调用(编辑:根据@Kamil,MOC针对.cpp源文件运行,但生成的.moc文件应为#include - d。手动在.cpp文件中 - 请参阅下面的编辑。

然后,将相应的头文件添加到.pro文件中的HEADERS变量。

当然,#include与test.cpp相同的标题。

此外,请在此处查看此答案:

https://stackoverflow.com/a/5854884/1284631

编辑:

根据这个帖子:http://www.qtcentre.org/threads/28580-Why-does-qmake-moc-only-process-header-files

要强制MOC运行.cpp文件,您应该添加:

#include "test.moc"

正好在你班级的定义之下。并重新运行qmake。但是,我没有测试过这个。

edit2:有关OP正在寻找的内容的讨论,请参阅此参考资料:

http://harmattan-dev.nokia.com/docs/library/html/qt4/moc.html