是否有可能在没有GL loader lib的情况下在Windows上与OpenGL> 1.1进行链接?

如果我只是使用glcorearb.h ,我可以链接到OpenGL函数,这些函数不是在MSVC自带的1.1 OpenGL.lib中提供的吗? 当我只是包含头(与GL_GLEXT_PROTOTYPES定义)和编译,我得到了一堆未解决的外部,当我

 #define GLAPI __declspec(dllimport) 

我得到了一堆__imp__未解决的外部。 这些符号来自哪里? 依赖沃克在这里没有给我任何有用的东西。

如果我能做到这一点,我如何设置它在MSVC?

我问,因为我不需要加载器提供的任何高级function(即支持检测),但我确实需要现代的OpenGL。

不,你需要一个“加载器”(GLEW或GLee,或者你写的/自己生成的东西)。 它不会工作。

GL_GLEXT_PROTOTYPES的存在确实表明,你可以简单地“链接到某个东西”,所以它只是起作用,但事实并非如此,不要定义它(老实说,我不知道它存在的是什么)。
必须在运行时解析符号既是OpenGL的祝福也是诅咒,但是你不能绕过它。 最好的事情是不要浪费时间思考它,只需下载GLEW。 它的作品,你完成你的程序。
如果GLEW太臃肿或不够漂亮,你可以使用一个可用的“加载器生成器”,从规范中生成一个特定的版本和扩展子集,我认为Alfonse Reinhart在Github上有一个。

如果你只需要5-6个函数,你也可以考虑手动加载它们(“编写自己的加载器”),但是自己编写一个完全成熟的加载器(或者加载器生成器)是一个巨大的时间浪费,而且根本不重要(我过去做过,所以我知道)。

您可以使用wglGetProcAddress()来解析符号:

glprofile.h:

 #define APIENTRY __stdcall extern GLuint (APIENTRY *glCreateShader_ptr)(GLenum); #define glCreateShader glCreateShader_ptr ... 

glprofile.c:

 GLunint (APIENTRY *glCreateShader_ptr)(GLenum) = 0; ... // Should be called after GL context creation void initGl() { glCreateShader_ptr = (GLuint (APIENTRY *)(GLenum))wglGetProcAddress("glCreateShader"); ... } 

这是GLEW实际上做的。