首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VTable未生成

VTable未生成
EN

Stack Overflow用户
提问于 2011-04-21 17:35:08
回答 2查看 289关注 0票数 0

首先,非常感谢你抽出时间来看我的问题。其次,我读过,我的课堂上没有任何我忘记包含的虚拟方法。在我描述我的问题之后,我会再看一遍我尝试过的其他事情。

当我使用gcc版本3.4.6 20060404构建代码时,我得到了对‘`vtable for SubcomponentTypeWidget’错误的未定义引用。2005没有问题。我喜欢Linux,但我目前的政治形势已经把它委托给了一个经常遭受虐待的红头步进式的孩子。希望我们的力量加在一起,我能弥补这一点。

我使用的是Qt版本4.6.2。我用gcc 3.4.6 20060404在红帽4号。

这是我的标题:

代码语言:javascript
复制
#ifndef SubcomponentTypeWidget_h
#define SubcomponentTypeWidget_h

#include <vector>
#include "ui_SubcomponentTypeWidget.h"
#include "Subcomponent.h"

class SubcomponentTypeWidget : public QWidget, public Ui::SubcomponentTypeWidget
{
    Q_OBJECT

    Q_PROPERTY(QString title READ title WRITE setTitle)

public:
    SubcomponentTypeWidget(QWidget* parent,
        Models::Subcomponent::SubcomponentType subcomponentType = Models::Subcomponent::kSolid)
    :   QWidget(parent),
    m_subcomponentType(subcomponentType),
        m_subcomponentTypeButtonGroup(new QButtonGroup(this))
    {
        this->initialize();
    }

    Models::Subcomponent::SubcomponentType subcomponentType() const { return m_subcomponentType; }

    void setSubcomponentType(Models::Subcomponent::SubcomponentType type);
    void setNonCompatibleTypes(const std::vector<Models::Subcomponent::SubcomponentType>& types);

    QString title() const { return m_subcomponentGroupBox->title(); }
    void setTitle(const QString &title) { m_subcomponentGroupBox->setTitle(title); }

signals:
    void subcomponentTypeChanged();

protected slots:
    void handleSubcomponentTypeChoice(int subcomponentTypeChoiceId);

protected:
    void initialize();
    Models::Subcomponent::SubcomponentType m_subcomponentType;
    QButtonGroup* m_subcomponentTypeButtonGroup;
};

#endif // SubcomponentTypeWidget_h

执行工作如下:

代码语言:javascript
复制
#include "SubcomponentTypeWidget.h"

void SubcomponentTypeWidget::setSubcomponentType(Models::Subcomponent::SubcomponentType type)
{
    if (type != m_subcomponentType)
    {
        m_subcomponentType = type;
        emit subcomponentTypeChanged();
    }
}

void SubcomponentTypeWidget::setNonCompatibleTypes(const std::vector<Models::Subcomponent::SubcomponentType>& types)
{
    m_subcomponentTypeButtonGroup->button(static_cast<int>(Models::Subcomponent::kSolid) + 1)->setEnabled(true);
    m_subcomponentTypeButtonGroup->button(static_cast<int>(Models::Subcomponent::kComplement) + 1)->setEnabled(true);
    m_subcomponentTypeButtonGroup->button(static_cast<int>(Models::Subcomponent::kHole) + 1)->setEnabled(true);

    for (std::vector<Models::Subcomponent::SubcomponentType>::const_iterator it = types.begin(); it != types.end(); ++it)
    {
        m_subcomponentTypeButtonGroup->button(static_cast<int>(*it) + 1)->setEnabled(false);
        if (*it == m_subcomponentType)
            m_subcomponentTypeButtonGroup->button(static_cast<int>(Models::Subcomponent::kSolid) + 1)->setChecked(true);
    }
}

void SubcomponentTypeWidget::handleSubcomponentTypeChoice(int subcomponentTypeChoiceId)
{
    if (static_cast<Models::Subcomponent::SubcomponentType>(subcomponentTypeChoiceId - 1) != m_subcomponentType)
    {
        m_subcomponentType = static_cast<Models::Subcomponent::SubcomponentType>(subcomponentTypeChoiceId - 1);
        emit subcomponentTypeChanged();
    }
}

void SubcomponentTypeWidget::initialize()
{
    this->setupUi(this);

    m_subcomponentTypeButtonGroup->addButton(m_solidRadioButton, static_cast<int>(Models::Subcomponent::kSolid) + 1);
    m_subcomponentTypeButtonGroup->addButton(m_complementRadioButton, static_cast<int>(Models::Subcomponent::kComplement) + 1);
    m_subcomponentTypeButtonGroup->addButton(m_holeRadioButton, static_cast<int>(Models::Subcomponent::kHole) + 1);

    m_subcomponentTypeButtonGroup->button(static_cast<int>(m_subcomponentType) + 1)->setChecked(true);

    connect(m_subcomponentTypeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(handleSubcomponentTypeChoice(int)));
}

我收到的实际错误消息是:

代码语言:javascript
复制
../lib/libMeshAndGeometry.a(AddAdvancedDialog.o)(.gnu.linkonce.t._ZN20Ui_AddAdvancedDialog7setupUiEP7QDialog+0x955): In function `Ui_AddAdvancedDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddAdvancedDialog.o)(.gnu.linkonce.t._ZN20Ui_AddAdvancedDialog7setupUiEP7QDialog+0x960): In function `Ui_AddAdvancedDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddAdvancedDialog.o)(.gnu.linkonce.t._ZN20Ui_AddAdvancedDialog7setupUiEP7QDialog+0x99b): In function `Ui_AddAdvancedDialog::setupUi(QDialog*)':
: undefined reference to `SubcomponentTypeWidget::initialize()'
../lib/libMeshAndGeometry.a(AddBoxDialog.o)(.gnu.linkonce.t._ZN15Ui_AddBoxDialog7setupUiEP7QDialog+0xfe8): In function `Ui_AddBoxDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddBoxDialog.o)(.gnu.linkonce.t._ZN15Ui_AddBoxDialog7setupUiEP7QDialog+0xff3): In function `Ui_AddBoxDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddBoxDialog.o)(.gnu.linkonce.t._ZN15Ui_AddBoxDialog7setupUiEP7QDialog+0x102e): In function `Ui_AddBoxDialog::setupUi(QDialog*)':
: undefined reference to `SubcomponentTypeWidget::initialize()'
../lib/libMeshAndGeometry.a(AddConeDialog.o)(.gnu.linkonce.t._ZN16Ui_AddConeDialog7setupUiEP7QDialog+0x7ef): In function `Ui_AddConeDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddConeDialog.o)(.gnu.linkonce.t._ZN16Ui_AddConeDialog7setupUiEP7QDialog+0x7fa): In function `Ui_AddConeDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddConeDialog.o)(.gnu.linkonce.t._ZN16Ui_AddConeDialog7setupUiEP7QDialog+0x835): In function `Ui_AddConeDialog::setupUi(QDialog*)':
: undefined reference to `SubcomponentTypeWidget::initialize()'
../lib/libMeshAndGeometry.a(AddCylinderDialog.o)(.gnu.linkonce.t._ZN20Ui_AddCylinderDialog7setupUiEP7QDialog+0x9c4): In function `Ui_AddCylinderDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddCylinderDialog.o)(.gnu.linkonce.t._ZN20Ui_AddCylinderDialog7setupUiEP7QDialog+0x9cf): In function `Ui_AddCylinderDialog::setupUi(QDialog*)':
: undefined reference to `vtable for SubcomponentTypeWidget'
../lib/libMeshAndGeometry.a(AddCylinderDialog.o)(.gnu.linkonce.t._ZN20Ui_AddCylinderDialog7setupUiEP7QDialog+0xa0a): In function `Ui_AddCylinderDialog::setupUi(QDialog*)':

我所有的makefile都是使用qmake从我的.pro文件中生成的。主make文件、主.pro文件、以及小部件以及MeshAndGeometry make和.pro文件都附加了这里作为归档文件。其中一个.ui文件附加了这里

我尝试过许多事情。

  1. 我相信这不是一个过时的对象文件问题。我是从零开始建造的,我仍然有这个问题。
  2. 我检查了我所有的资本化问题。我注意到的问题之一是,在Windows上执行这些操作,然后将其转移到Linux中,人们在大写方面会出错,而Windows并不关心大写化。
  3. 我运行nm -a -C子组件TypeWidget.o来查看是否存在必要的vtable,但它没有,但是“缺失”方法在那里。
  4. 创建虚拟析构函数并不强制为SubcomponentTypeWidget生成vtable。
  5. 我已经尝试过删除SubcomponentTypeWidget功能的大块。这会导致删除方法的特定链接器错误消息,但不会删除对vtable消息的未定义引用。除了构造函数之外,我已经从SubcomponentTypeWidget中删除了所有内容,在本例中,我仍然收到“对vtable的未定义引用”消息,但没有提到我们正在寻找的特定方法。
  6. 更改连接小部件和MeshingAndGeometry的顺序没有帮助。
  7. 我试过gcc版本3.4.6 20060404和4.1.2 20080704。

帮帮我,欧比-万·克诺比。你是我唯一的希望。

非常非常感谢大家,

-Brian J. Stinar-

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-22 17:56:08

我的问题是解决问题的第六点。实际上,我并没有正确地更改这个命令。我改变了INCPATH中的顺序,而不是LIBS中的顺序。

在将MeshAndGeometry.depends = widgets行添加到我的master.pro文件、运行qmake和运行make之后,这个问题就消失了。

非常感谢大家的意见和帮助。

-Brian J. Stinar-

票数 0
EN

Stack Overflow用户

发布于 2011-04-21 19:01:36

在您的代码中,错误最有可能来自以下语句:

代码语言:javascript
复制
=======================================================
void SubcomponentTypeWidget::initialize()
{
    this->setupUi(this);
    //rest of codes
}
=======================================================

您将SubcomponentTypeWidget作为Ui::SubcomponentTypeWidget的子类,从而破坏了Qt的结构。在这种情况下,您实际上是在使用自己来设置自己的UI。再加上您使用的是多类继承,您只是混淆了在运行时要引用哪个虚拟方法的编译器。

与其子类Ui:: SubcomponentTypeWidget,不如让它成为SubcomponentTypeWidget中的私有变量

代码语言:javascript
复制
//SubcomponentTypeWidget.h
     private:
         Ui::SubcomponentTypeWidge ui;

在init函数中实现以下内容,您应该会做得很好

代码语言:javascript
复制
void SubcomponentTypeWidget::initialize()
{
    ui.setupUi(this);
    //rest of codes
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5747705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档