调用glewInit()触发段错误的原因排查求助
问题原因与修复方案
你的代码存在逻辑顺序错误,并非库的问题。
- 错误核心:你在调用
glfwMakeContextCurrent(window)之后才检查window是否为空。如果glfwCreateWindow失败返回nullptr,此时调用glfwMakeContextCurrent(nullptr)会导致后续glewInit()因缺少有效OpenGL上下文触发段错误。 - 修复要点:
- 先判断窗口创建是否成功,再设置当前OpenGL上下文
- 启用GLEW核心模式兼容,适配OpenGL Core Profile环境
修复后的代码:
#include <GL/glew.h> #include <GLFW/glfw3.h> #include <stdio.h> const int WIDTH = 640; const int HEIGHT = 480; int main(int argc, char **argv) { // 初始化GLFW并配置窗口参数 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // macOS环境需额外添加该行 // glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Spinning Cube", nullptr, nullptr); // 先检查窗口创建状态 if (!window) { glfwTerminate(); // 清理GLFW资源 return 1; } // 确认窗口有效后再设置当前上下文 glfwMakeContextCurrent(window); // 启用GLEW核心模式,避免Core Profile下的兼容性问题 glewExperimental = GL_TRUE; GLenum err = glewInit(); if (err != GLEW_OK) { fprintf(stderr, "GLEW初始化失败: %s\n", glewGetErrorString(err)); glfwTerminate(); return 1; } // ...后续业务代码 // 主循环与资源清理 while (!glfwWindowShouldClose(window)) { glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
补充说明:
glewExperimental = GL_TRUE:OpenGL 3.2+ Core Profile环境下,必须启用该选项才能让GLEW正确加载核心模式的函数,否则可能出现未定义行为- 所有涉及窗口的操作必须在窗口创建成功后执行,避免空指针操作
- 程序退出前务必调用
glfwTerminate()清理GLFW占用的系统资源
内容的提问来源于stack exchange,提问作者SparkDev
相关产品推荐
相关产品推荐

