我正在尝试使用 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
我这辈子都想不通。我调用 glewInit
制作 OpenGL 窗口后,我正在导入 glew
之前 glfw
.我究竟做错了什么?
最佳答案
main 之前的崩溃是由于静态初始化或动态库。
看来您在 Windows 上,在这种情况下 glew
发布文件包含两个库 glew32.lib
和 glew32s.lib
.
您正在链接非静态链接,请尝试 -lglew32s
.第一个只是一个将搜索.dll 的 stub ,通常位于glew/bin
。文件夹,您必须使用 main.exe
将其复制到工作目录.删除 GLEW_STATIC
如果你选择走这条路。
为防止将来出现错误,请添加 glewExperimental=GL_TRUE;
glewInit
之前的某处.它在某些驱动程序上启用 OpenGL 3.3+ 功能。
至于为什么它现在可以工作,首先存在扩展加载库的全部原因是默认驱动程序仅包含 OpenGL 1.x 功能。所有较新的函数必须在运行时直接从 .dll
加载。您的 GPU 使用 dllopen()
提供的驱动程序和 GetProcAddress()
这正是这些库为您所做的。这就是为什么大多数较新的函数实际上是作为宏实现的(包装函数指针)。也就是说,您没有使用任何新功能(您确实应该使用),所以一切正常。
关于c++ - 调用 glewInit() 导致 main 函数不被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63988496/