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

考虑下面的文件:

#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在gcc 4.8.2上编译x86 Linux。

到底是怎么回事? 我做的许多其他的OpenGL ES 2.0调用(glDrawArrays,glGenBuffers等)都可以很好的与C和C ++一起工作。 另外,不是C ++应该能够调用C库,尤其是那些(应该)被devise用来防止函数名称改变的系统库?

什么是错的,我该如何解决这个问题?

Solutions Collecting From Web of "为什么glGenVertexArrays是针对C程序而不是Linux上的C ++程序定义的?"

https://www.khronos.org/opengles/sdk/docs/man3/html/glGenVertexArrays.xhtml

以前的答案也是正确的,但并没有真正给出解决方案。 也不是我的。 这只是glGenVertexArrays不支持的OpenGLES 2。

解决方案:使用OpenGL ES 3。

看一下gl2.h头文件 ,似乎上面提到的函数没有在那里定义。 C ++在函数声明和定义方面有更严格的规则。 在C中,你可以完美地使用一个函数,而这个函数并不是事先声明的,编译器会假定一个原型。 在C ++中,任何函数在使用之前都必须至少声明。

5.2.2 C ++规范的函数调用 ,第2小节指出:

注意:如果使用函数或成员函数名称,并且名称查找(3.4)没有找到该名称的声明,则该程序是格式不正确的。 这样的调用没有隐含地声明函数。 – 结束笔记

这就是与C不同的地方。然而,这可能意味着更深层次的问题:要么使用错误的头文件,要么使用支持该函数的OpenGL实现进行链接,或者不知何故,头文件应该包含该声明,而不是。 我的第一个猜测是,你应该仔细检查你有效链接的OpenGL实现,以及你使用的头是否是正确的。

但是,这个OpenGL标准也可能将该函数定义为扩展名,或者由于该驱动程序支持更高的标准或扩展名,链接器可以看到该函数。 如果没有首先检查相应的扩展是否被驱动程序真正支持,那么依靠这个功能当然是不推荐的。