为什么glGenVertexArrays是为C程序定义的,而不是Linux上的C ++程序?

时间:2014-06-03 16:55:06

标签: c++ c linux opengl opengl-es-2.0

考虑以下文件:

#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库,特别是那些(应该)设计用来阻止函数名称修改的系统库?

有什么问题,我该如何解决?

2 个答案:

答案 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标准也可能将该函数的定义保留为扩展,或者链接器可以看到该函数,因为驱动程序支持更高的标准或扩展。如果没有先检查驱动程序是否实际支持相应的扩展名,当然不建议依赖该功能。