1

我正在使用 Qt 创建一个 GUI 应用程序;我尝试hello world使用 Qt 并且它运行良好,但是当我创建自定义列表小部件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

4

4 回答 4

5

您还需要定义 dtor,这将创建 vtable

CustomMenuFilter::~CustomMenuFilter() { ... }

虽然有一些(依赖于编译器的)规则描述了编译器何时准确地发出一个 vtable,但您知道它通常并不重要。重要的是,您需要定义 dtor,然后编译器将处理 vtable,因此如果您看到错误“未定义对 vtable 的引用”,请始终检查 dtor。

于 2013-03-09T10:54:58.190 回答
2

几个编译器在 TU 中发出 vtable,它定义了虚拟的第一个外线定义——隐含地,在这种情况下就是你的析构函数(因为 QMenu 的析构函数可能是虚拟的)。

所以添加你的析构函数的定义应该可以解决它。

// CustomMenuFilter.cpp

CustomMenuFilter::~CustomMenuFilter() {}
于 2013-03-09T10:55:12.530 回答
1

从#qt factoids 中,当在 QObject 派生类上收到 vtable 错误时:

  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.o ./trunk/Source/Interface.o ./trunk/Source/Manager.o ./trunk/源/QMenuFilter.o ./trunk/Source/main.o -lopencv_core -lopencv_objdetect -lopencv_video -lopencv_highgui -lopencv_imgproc

没有链接 moc_QMenuFilter.o。这是错误。很可能您添加了Q_OBJECT宏并忘记重新运行 qmake(或者甚至没有HEADERS在 .pro 文件的列表中添加标题)。

于 2013-03-09T13:12:24.677 回答
0

将 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)
于 2017-11-15T13:23:10.083 回答