我一直在尝试在我的新arch linux盒子上开始使用OpenGL和C ++,但我只能使用OpenGL 3.0之前的函数。
例如,以下代码有效:
glBegin(GL_TRIANGLES);
{
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
}
glEnd();
但以下情况并非如此:
GLuint vertexArrayID;
glGenVertexArrays(1, &vertexArrayID);
glBindVertexArray(vertexArrayID);
它无法找到函数glGenVertexArrays
和glBindVertexArray
,如Eclipse的输出所示:function glGenVertexArrays cannot be resolved.
那会是什么导致这个?坏图书馆链接?老司机?
我的glxinfo:
OpenGL renderer string: AMD Radeon HD 6450
OpenGL core profile version string: 4.3.12414 Core Profile Context 13.15.100.1 OpenGL core profile shading language version string: 4.30
答案 0 :(得分:2)
根据您拥有的GPU,它可能是糟糕的链接或旧驱动程序。你在使用GLEW吗?您应该链接到那些以使用这些函数调用。
答案 1 :(得分:1)
这是一个链接时问题。在OpenGL中,GLX / EGL / WGL / ...用于在运行时加载扩展(更确切地说,用于分配过程地址)。这意味着您没有包含正确的扩展标头和/或没有链接到相应的库,因此链接器无法确定函数指针位置。
此外,预处理器定义可能会阻止您的扩展库(例如GLEW)为GL API的整个子集提供函数原型和/或符号;你应该参考你图书馆的文件。
这些函数在运行时仍然很可能无法使用(例如,扩展未实现),但这将以NULL指针的形式出现,而不是链接器错误。
另请注意,像GLEW这样的库需要使用每个新版本的OpenGL进行更新。它们根据扩展规范为扩展提供函数原型,枚举等。这意味着在发布扩展规范之前编译的GLEW版本将不知道该扩展的任何内容:)
如果您没有自己编译,或者如果您没有使用最近的代码库,那么您可能正在使用早于OpenGL 3.0的GLEW版本。
答案 2 :(得分:0)
添加第三方库时会发生链接问题,例如GL,GLU或GLUT。它可能是编译器找不到.lib文件或.dll文件。一些函数如glbegin()可以工作,因为它们可能是在头文件中声明和定义的。 glGenVertexArrays不工作,因为它只在头文件上声明并在.c或.cpp文件上实现或定义。现在,如果没有完成链接,您将收到错误消息:func无法解析。
答案 3 :(得分:0)
我想我找到了解决方案。我使用的是带有AMD GPU的Arch Linux,因此有两个驱动程序:Mesa(开源)和Catalyst(专有)。我正在使用催化剂,因为mesa不支持opengl 3.0+。但我包括GL / gl.h,这是mesa的头文件。我通过包含GL / glATI.h来解决这个问题。
我不确定这是否是一个很好的解决方案,如果它适用于所有系统,但它似乎对我有用。