问题描述
我正在尝试使用GLFW和GLEW。目前,我的代码有效,并且我看到一个带有三角形的窗口:
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <time.h>
#include "constants.h"
int main(void) {
GLFWwindow* window;
if (!glfwInit()) {
glfwTerminate();
return -1;
}
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(WINDOW_WIDTH,WINDOW_HEIGHT,"Window",NULL,NULL);
if (!window) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
// if (glewInit() != GLEW_OK) {
// fprintf(stderr,"failure");
// return -1;
// }
glfwSetInputMode(window,GLFW_STICKY_KEYS,GL_TRUE);
while (glfwGetKey(window,GLFW_KEY_ESCAPE ) != GLFW_PRESS && glfwWindowShouldClose(window) == 0) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2f(0,0);
glVertex2f(0,1);
glVertex2f(1,0);
glEnd();
glfwSwapBuffers(window); /* Swap front and back buffers */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
上面的代码有效。但是,当我取消注释时:
if (glewInit() != GLEW_OK) {
fprintf(stderr,"failure");
return -1;
}
程序以静默方式退出。我用断点确认了main
函数甚至没有被调用。如果有帮助,这是我的编译命令:
g++ -g main.cpp -I\glfw-3.3.2\include -I\glew-2.1.0\include -L\glfw-3.3.2\lib-mingw-w64 -L\glew-2.1.0\lib\Release\x64 -lglfw3 -lgdi32 -lopengl32 -luser32 -lshell32 -lglew32 -o main.exe
我一生都无法解决。我在制作OpenGL窗口后调用glewInit
,在glew
之前导入glfw
。我在做什么错了?
解决方法
main崩溃是由于静态初始化还是动态库
。似乎您在Windows上,在这种情况下,glew
版本文件包含两个库glew32.lib
和glew32s.lib
。
您要链接到非静态链接,请尝试-lglew32s
。第一个只是一个存根,它将搜索通常位于glew/bin
文件夹中的.dll,您必须使用main.exe
将其复制到工作目录。如果选择这种方式,请删除GLEW_STATIC
。
为防止将来发生错误,请在glewExperimental=GL_TRUE;
之前添加glewInit
。它在某些驱动程序上启用OpenGL 3.3+功能。
至于现在为什么起作用,首先存在扩展加载库的全部原因是默认驱动程序仅包含OpenGL 1.x功能。必须在运行时使用.dll
和dllopen()
从GPU提供的GetProcAddress()
驱动程序中直接加载所有较新的函数,这正是这些库为您提供的功能。这就是为什么大多数较新的函数实际上都实现为宏(包装函数指针)的原因。就是说,您没有使用任何新功能(实际上应该使用),所以一切正常。