很抱歉,如果这个问题的标题措辞不好,但我有一个带有成员函数的类,而这个函数又会调用几个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'关键字)并在相应的源文件中定义函数,它可以正常工作。源文件没有任何其他包含,它只包含头文件,而头文件又包括:
#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),一切似乎都设置好了。
答案 0 :(得分:0)
这也可能是名称空间问题,正在工作的东西可能是标题中的#defines,它们不受命名空间的影响,而在其中一个文件中,#include语句可能位于名称空间内。影响正常的功能定义。对不起,只是猜测,我绝对肯定有一些奇怪的事情发生。
答案 1 :(得分:0)
我能够通过将一个define选项传递给编译器来解决这个问题,而不是依赖于以下的定义宏:
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>
我真的不知道为什么最终会起作用。我认为这意味着当编译器首次读入GL / glext.h时,未定义GL_GLEXT_PROTOTYPES。
我不确定预处理程序#defines以什么顺序生效但是我猜可能GL / glext.h首先包含在其他地方?