You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用glewInit()触发段错误的原因排查求助

问题原因与修复方案

你的代码存在逻辑顺序错误,并非库的问题。

  • 错误核心:你在调用glfwMakeContextCurrent(window)之后才检查window是否为空。如果glfwCreateWindow失败返回nullptr,此时调用glfwMakeContextCurrent(nullptr)会导致后续glewInit()因缺少有效OpenGL上下文触发段错误。
  • 修复要点:
    1. 先判断窗口创建是否成功,再设置当前OpenGL上下文
    2. 启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:55:16