与vtables奇怪,奇怪的错误

时间:2015-02-01 23:43:16

标签: c++ qt opengl inheritance qt5

我正在将我的代码从以前的API(SDL)移到Qt 5.4。我有一些与Qt无关的课程,并且在CodeBlocks / Visual studio上工作得很好。在我的代码中:

void ModelLoader::processNode(aiNode *node, const aiScene *scene, vector<Mesh> &mesh)
{
    for (unsigned int i = 0; i < node->mNumMeshes; i++)
    {
        aiMesh *me = scene->mMeshes[node->mMeshes[i]];
        Mesh tmesh = processMesh(me, scene);
        mesh.push_back(tmesh); // Won't let me push back!
    }
    for (unsigned int i = 0; i < node->mNumChildren; i++)
    {
        processNode(node->mChildren[i], scene, mesh);
    }
}

它可以编译并在其他IDES上运行得很好,但Qt Creator由于某种原因不喜欢它。这里的模型加载器类不会继承任何东西,每当我使用这段代码编译时,它都会给我这个错误:

ModelLoader.o:-1: In function `QAbstractOpenGLFunctions::QAbstractOpenGLFunctions(QAbstractOpenGLFunctions const&)':

error: undefined reference to `vtable for QAbstractOpenGLFunctions'

:-1: error: collect2: error: ld returned 1 exit status

这令人困惑:我不是从这堂课继承的!但是,我必须承认,我可以理解为什么会这样说。你看,类'Mesh'以及其他类如Texture等:它们都继承自QOpenGLFunctions_4_3_Core,它们需要因为它们必须使用OpenGL的函数。我不想创建指向所述类的指针,因为这会使代码的可读性降低。我在继承自它的任何类的构造函数中初始化OpenGLFunctions()。我还在Mesh类中实现了虚拟析构函数,因为我从以前的经验中知道vtable错误通常来自这样的责备。

由于此代码在另一个IDE上完美运行,为什么Qt Creator会抱怨上述错误?当然它确实与QOpenGLFunctions有关。具有讽刺意味的是,从所述类继承的所有类都编译得很好;如果我省略ModelLoader,那么代码编译并运行时不会发生任何崩溃。

我设法将问题隔离到上面的函数中;从我的发现中,导致最大问题的代码行是当我推回临时网格时,它是processMesh(..)返回网格的结果。此代码在Codeblocks下正常运行,但它不在Qt Creator下运行。这真是令人沮丧,因为它就像Qt希望我采用它想要的编程风格,但我不知道为什么这里会出现这个错误以及为什么它与这个被称为QAbstractOpenGL的东西有关。 (到目前为止我见过的最长的名字,真的)

乍一看,它可能与Mesh类有关,因为它继承自QOpenGLFunctions_4_3_Core。如果我在Mesh的构造函数中注释掉所有内容(包括所述类的初始化函数),那么我仍然会得到相同的错误。

我需要其他人的意见,最好是那些熟悉Qt的人以及与OpenGL就此课程进行沟通的方式。为什么Qt Creator而不是其他IDE会出现此错误? Qt在这里要求什么?

0 个答案:

没有答案