考虑以下文件:
#include <SDL.h>
#include <GLES2/gl2.h>
int main() {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *window = SDL_CreateWindow("Test", 0, 0, 200, 200, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
SDL_GLContext context = SDL_GL_CreateContext(window);
GLuint vao;
glGenVertexArrays(1, &vao);
}
如果以上是test.c,则以下行(编译为C代码)可以正常工作:
gcc test.c -I/usr/include/SDL2 -lGLESv2 -lSDL2
然而,下一个(编译为C ++代码)不会:
gcc -x c++ test.c -I/usr/include/SDL2 -lGLESv2 -lSDL2
我得到的错误是:
test.c: In function ‘int main()’:
test.c:9:27: error: ‘glGenVertexArrays’ was not declared in this scope
glGenVertexArrays(1, &vao);
我正在使用SDL 2.0和OpenGL ES 2.0在x86 Linux上使用gcc 4.8.2进行编译。
发生了什么事?我制作的许多其他OpenGL ES 2.0调用(glDrawArrays,glGenBuffers等)与C和C ++都能很好地协同工作。另外,C ++是不是应该能够调用C库,特别是那些(应该)设计用来阻止函数名称修改的系统库?
有什么问题,我该如何解决?
答案 0 :(得分:4)
https://www.khronos.org/opengles/sdk/docs/man3/html/glGenVertexArrays.xhtml
之前的答案也是正确的,但并没有真正给出解决方案。实际上也不是我的只是OpenGLES 2不支持glGenVertexArrays
。
解决方案:使用OpenGL ES 3。
答案 1 :(得分:2)
查看gl2.h
header,似乎没有在那里定义上述功能。 C ++在函数声明和定义方面有更严格的规则。在C中,您可以完美地使用一个事先未声明的函数,编译器将假定某个原型。在C ++中,任何函数必须至少在任何使用之前声明。
C ++规范的 5.2.2 - 函数调用部分,第2段表明:
注意:如果使用函数或成员函数名称,并且名称查找(3.4)未找到声明 这个名字,该程序是不正确的。这种调用没有隐式声明任何函数。 - 结束说明
这就是C的不同之处。但是这可能表明一个更深层次的问题:要么使用错误的标头,要么链接到支持该功能的OpenGL实现,或者不知何故,标题应该包含该声明并且不。我的第一个猜测是你应该仔细检查你实际链接的OpenGL实现,以及你使用的头是否是正确的。
但是,此OpenGL标准也可能将该函数的定义保留为扩展,或者链接器可以看到该函数,因为驱动程序支持更高的标准或扩展。如果没有先检查驱动程序是否实际支持相应的扩展名,当然不建议依赖该功能。