更新 2经过一番折腾(以及对生成的 Makefile 进行了一些编辑),看起来发生的原因是 moc 没有正确处理 MainWindow.h(包含在 main.cpp 和
更新 2
经过一番捣鼓(以及对生成的 Makefile 进行一些编辑)之后,看起来发生的事情是 moc 没有被正确处理 MainWindow.h
(包含在内 main.cpp
, MainWindow.cpp
除非它与包含它的源文件位于同一文件夹中)。
Moc 在 上运行 MainWindow.cpp
,不处理包含,因此看不到 Q_OBJECT 宏,因此继续生成一个空的输出文件。我不确定 moc 是否通常处理包含,或者它是否只扫描目录,但无论哪种方式,需要 mocing 但位于其他目录中的标头都不会被处理!
更新
问题似乎与 moc 生成的输出有关。在第一种情况下(编译的那种), hello-world_automoc.cpp
生成了 。 moc_MainWindow.cpp
看起来 hello-world_automoc.cpp
像
/* This file is autogenerated, do not edit*/
#include "moc_MainWindow.cpp"
在第二种情况下, hello-world_automoc.cpp
产生的结果是
/* This file is autogenerated, do not edit*/
enum some_compilers { need_more_than_nothing };
根本没有 moc_MainWindow.cpp
。如果我手动从 cmake 调用 moc,而不是在损坏的情况下使用 automoc,我会得到结果, moc_MainWindow.cpp
但它是空的。
原始状态
首先,我没有忘记 设置(CMAKE_AUTOMOC ON)
。还要注意, MainWindow
的 析构函数已声明并实现 .
当我的目录结构如下所示时:
CMakeLists.txt
|__ main.cpp
|__ MainWindow.cpp
|__ MainWindow.h
|__ MainWindow.ui
编译工作正常。
然而,当它看起来像:
helloworld/
|__ CMakeLists.txt
|__ src/
| |__ CMakeLists.txt
| |__ main.cpp
| |__ MainWindow.cpp
|
|__ inc/
| |__ MainWindow.h
|
|__ gui/
|__ MainWindow.ui
我收到链接错误:
Linking CXX executable hello-world
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::MainWindow()':
MainWindow.cpp:(.text+0x3b): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0x4d): undefined reference to `vtable for MainWindow'
CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::~MainWindow()':
MainWindow.cpp:(.text+0xaf): undefined reference to `vtable for MainWindow'
MainWindow.cpp:(.text+0xc1): undefined reference to `vtable for MainWindow'
collect2: error: ld returned 1 exit status
make[2]: *** [src/hello-world] Error 1
make[1]: *** [src/CMakeFiles/hello-world.dir/all] Error 2
我真的很想将我的源和标题放在适当的子目录中,但我不太确定如何解决这个问题。
这实际上是大型项目中最简单的可识别错误情况,因此我并不热衷于扁平化项目目录,只是因为我要向其中添加 Qt GUI。
Qt 5 cmake 失败,在 hello world 中对 vtable 的引用未定义,其中 inc 和 src 为子目录
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!