对虚表的未定义引用
Undefined reference to `vtable
我正在使用Qt创建一个GUI应用程序;我尝试使用Qt做hello world
,它工作完美,但当我创建自定义列表小部件时,我得到undefined reference to vtable
错误,当我编译它:
我正在使用eclipse和c++
#ifndef QMENUFILTER_H_
#define QMENUFILTER_H_
#include <qmenu.h>
class CustomMenuFilter : QMenu
{
Q_OBJECT
public:
CustomMenuFilter () ;
~CustomMenuFilter() ;
private:
QMenu FilterMenu;
QAction *AddFilterAct ;
QAction *DeleteFilterAct ;
Q_SLOT
void contextMenuEvent(QContextMenuEvent *event);
};
#endif /* QMENUFILTER_H_ */
#include "QMenuFilter.h"
CustomMenuFilter::CustomMenuFilter():QMenu()
{
DeleteFilterAct = new QAction("DeleteFilter" , this);
AddFilterAct = new QAction("AddFilter" , this);
AddFilterAct->setText("AddFilter");
DeleteFilterAct->setText("DeleteFilter");
}
日志文件:http://pastebin.com/raw.php?i=qZes6bkm
还需要定义doctor,它将创建虚表
CustomMenuFilter::~CustomMenuFilter() { ... }
虽然有一些(依赖于编译器的)规则描述了编译器何时发出虚函数表,但通常不需要知道。重要的是,你需要定义dr,然后编译器会处理这个虚表,所以如果你看到错误"undefined reference to vtable",一定要检查一下dr。
一些编译器在TU中发出虚函数表,它定义了虚函数的第一个行外定义——隐式地,在这种情况下,它是你的析构函数(因为QMenu的析构函数可能是虚函数)。
所以添加析构函数的定义应该可以解决这个问题。
// CustomMenuFilter.cpp
CustomMenuFilter::~CustomMenuFilter() {}
从#qt factoids,当获得一个虚值表错误到qobject派生类:
- 确保
Q_OBJECT
宏存在于所有qobject派生类的定义中。 确保只在头文件中声明qobject派生类。 - 确保所有的头文件都在
HEADERS
列表中的.pro文件中列出。 - 每次添加
Q_OBJECT
到你的一个类或修改你的。pro文件时运行qmake。
我没有看到moc的输出链接在最终的可执行文件在你的构建日志:
g++ -L/usr/local/lib/-lQtGui -lQtCore -o "CameraManagerAfterBeta" ./trunk/Source/Camera. log "o。/箱子/源/接口。o。/箱子/源/经理。o。/箱子//QMenuFilter来源。o。/箱子//主要来源。0 -lopencv_core -lopencv_objdetect -lopencv_video -lopencv_highgui -lopencv_imgproc
没有moc_QMenuFilter。O被连入。就是错误。很可能您添加了Q_OBJECT
宏而忘记重新运行qmake(或者甚至没有在.pro文件中的HEADERS
列表中添加标题)。
设置CMAKE_AUTOMOC为ON,这就解决了我的问题。
#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
- 编译C++时未定义的引用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 对 Scalar ::Scalar() 的未定义引用
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 对复制 CTOR 和 CTOR 的未定义引用
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 右值引用未定义的行为
- 对"vtable for DigitalClock"的未定义引用 - 未定义对"DigitalClock::staticMetaObject"的引用 - Qt
- 函数类型到函数类型的引用:未定义的引用
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确
- 从c++调用Fortran子程序,链接时引用未定义
- 枚举引用未定义,但位于包含的头文件中