为什么内联函数会导致编译器看不到OpenGL函数



如果这个问题的标题措辞不好,很抱歉,但我有一个类有一个成员函数,它反过来调用几个OpenGL函数:

class StateSet
{
public:
StateSet();
// ...
inline void SetVertexAttributeEnabled(GLuint location,bool enabled)
{
if(m_GL_VERTEX_ATTRIB_ARRAY_ENABLED[location] == enabled) {
return;
}
m_GL_VERTEX_ATTRIB_ARRAY_ENABLED[location] = enabled;
if(enabled) {
glEnableVertexAttribArray(location);
}
else {
glDisableVertexAttribArray(location);
}
}
// ...

当试图编译这个时,我得到了

'glEnableVertexAttribArray' was not declared in this scope
'glDisableVertexAttribArray' was not declared in this scope

如果我不使函数内联(去掉"inline"关键字)并在相应的源文件中定义函数,它就可以正常工作。源文件没有任何额外的include,它只包括头文件,而头文件又包括:

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>

那么,为什么内联会使编译器无法"看到"OpenGL函数调用呢?

这也不是所有OpenGL函数都会发生的——如果我尝试调用glDrawArrays、glGet[]等,我就可以编译

更多信息:

有问题的头文件和源文件的所有包含都是:

#include <vector>
#include <cassert>
#include <sstream>
#include <iostream>
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>

OpenGL及其上下文和所有内容都应该由Qt设置;这个类正在一个Qt应用程序中使用,在那里我已经可以调用函数(glEnable/DisableVertexAttribArray),一切似乎都设置好了。

这也可能是一个命名空间问题,正在工作的东西可能是头中的#defines,它不会受到命名空间的影响,而在其中一个文件中,#include语句可能在影响正常函数定义的命名空间内。抱歉,只是猜测,我绝对肯定有什么奇怪的事情在发生。

我通过向编译器传递一个define选项而不是依赖以下define宏来解决这个问题:

#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>

我真的不知道为什么会这样。我认为这意味着当编译器第一次读取GL/glext.h时,GL_glext_PROTOTYPES没有定义。

我不确定预处理器#定义的生效顺序,但我想GL/glext.h可能是先包含在其他地方的?

最新更新