对虚表的未定义引用

Undefined reference to `vtable

本文关键字:引用 未定义 虚表      更新时间:2023-10-16

我正在使用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派生类:

  1. 确保Q_OBJECT宏存在于所有qobject派生类的定义中。
  2. 确保只在头文件中声明qobject派生类。
  3. 确保所有的头文件都在HEADERS列表中的.pro文件中列出。
  4. 每次添加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)