【发布时间】:2014-06-03 16:55:06
【问题描述】:
考虑以下文件:
#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 库,尤其是(应该)旨在防止函数名称损坏的系统库?
出了什么问题,我该如何解决?
【问题讨论】:
-
完美运行?您至少需要使用 -Wall 进行编译才能声明。
-
@n.m.:
-Wall有误报和误报。 -
使用 -Wall 的误报比不使用的多,但漏报更少。为什么要用一个换另一个?您可以分析和抑制误报。
-
@n.m.,你是对的,
-Wall会使该函数调用变得可疑,我应该使用它(在我的辩护中,我已经习惯于使用带有 -Wall 的 Makefile 编译程序我这次忘记指定了)。 -
不是,唯一的区别是在C中是隐式声明(C++不这样做);它将通过编译阶段,但除非您链接到适当的库,否则它将无法在 C 中链接。
glGenVertexArrays (...)不是 OpenGL 2.0 或 OpenGL ES 2.0 的一部分,它已添加到 3.0在两者中。
标签: c++ c linux opengl opengl-es-2.0