为什么使用OpenGL函数需要Windows.h?

Wol*_*Doo 1 windows opengl winapi cross-platform

我正在开发一个使用 OpenGL 制作简单游戏的应用程序。刚开始学习OpenGL。为什么在下面的代码片段中我需要<Windows.h>识别GLuint vao?删除包含会导致错误。

#include <Windows.h>
#include <gl/GL.h>

int main() {
    GLuint vao;
}
Run Code Online (Sandbox Code Playgroud)

当我删除 include 时,出现 868 错误<Windows.h>'APIENTRY': this use of 'void' is not valid诸如、int APIENTRY: redefinition、之类的错误int WINGDIAPI: redefinition,老实说还有很多。

我正在 Windows 上进行开发,但这自动意味着如果没有一些外部工具包/库(如 GLEW、GLUT 等),跨平台是不可能的?我知道强烈建议使用它们,但由于某些原因,我无法使用它们。

另外,这是否意味着我需要包含<Windows.h>在使用 OpenGL 函数的每个文件中?我认为这并不是很好的做法。

BDL*_*BDL 5

在 Windows 上,需要先包含 Windows.h,然后再包含 GL.h。

但实际的问题不是GLuintGL.h 中定义了 的定义,而是 中定义的所有方法都需要和宏GL.h的定义。告诉编译器该方法必须从 dll(本身是特定于 Window 的)加载,并在 wingdi.h 中定义。定义在 minwindef.h 中。两者都包含在 Windows.h 中。WINGDIAPIAPIENTRYWINGDIAPIAPIENTRY

关于跨平台:问题是,虽然 OpenGL API(通常)是平台无关的,但 OpenGL 实现以及 OpenGL 上下文处理却不是。不同的系统甚至不使用相同的OpenGL头文件。例如,MacOS 使用,OpenGL/gl.h而 Windows 使用GL/gl.h. 其他示例,OpenGL 上下文是通过 wgl API 在 Windows 上创建的,而其他一些系统则使用 glx。如果您想开发跨平台,您要么需要自己抽象所有这些,要么使用已经为您完成此操作的库之一(glfw、glew)。