未定义的引用`vtable

时间:2013-03-09 10:51:04

标签: c++ eclipse qt

我正在使用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");
}

LOG文件: http://pastebin.com/raw.php?i=qZes6bkm

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

所以添加析构函数的定义应该修复它。

// CustomMenuFilter.cpp

CustomMenuFilter::~CustomMenuFilter() {}

答案 2 :(得分:1)

从#qt factoids中获取vtable错误到QObject派生类:

  1. 确保所有QObject派生类的定义中都存在Q_OBJECT宏。
  2. 确保仅在头文件中声明QObject派生类。
  3. 确保所有标头文件都列在HEADERS列表的.pro文件中。
  4. 每次将Q_OBJECT添加到其中一个类或修改.pro文件时运行qmake。

  5. 我没有在构建日志的最终可执行文件中看到moc的输出链接:

      

    g ++ -L / usr / local / lib / -lQtGui -lQtCore -o“CameraManagerAfterBeta”./ turunk / Source / Camera.o ./trunk/Source/Interface.o ./trunk/Source/Manager.o。 /trunk/Source/QMenuFilter.o ./trunk/Source/main.o -lopencv_core -lopencv_objdetect -lopencv_video -lopencv_highgui -lopencv_imgproc

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

答案 3 :(得分:0)

将CMAKE_AUTOMOC设置为ON,这解决了我的问题。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.5</version>
                <configuration>
                    <mojoDependencies>com.company:something</mojoDependencies>
                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                </configuration>
                <executions>
                    <execution>
                        <id>default-descriptor</id>
                        <goals>
                            <goal>descriptor</goal>
                        </goals>
                        <phase>process-classes</phase>
                    </execution>
                </executions>
            </plugin>