Qt "hello world" GUI 应用程序无法链接?
Qt "hello world" GUI app not linking?
可能重复:
Qt:信号和插槽错误:未定义的vtable引用
这里有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();
}
默认情况下,MOC不会对源文件调用,只对标头调用(编辑:根据@Kamil,MOC是针对.cpp源文件运行的,除了生成的.MOC文件应该在.cpp文件中手动为#include
-d之外——请参阅下面的编辑(。
然后,将相应的头文件添加到.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。然而,我没有对此进行测试。
编辑2:关于OP正在寻找的内容:,请参阅此参考资料
http://harmattan-dev.nokia.com/docs/library/html/qt4/moc.html
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 将类添加到基本Qt GUI应用程序时出现Qt链接器错误
- 使用自己的库编译Qt GUI时发生链接器错误
- 通过SWIG实现c++和Java GUI的链接
- Qt "hello world" GUI 应用程序无法链接?