我正在将我的代码从以前的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在这里要求什么?