OpenGL程序给出一个段错误

Posted

技术标签:

【中文标题】OpenGL程序给出一个段错误【英文标题】:OpenGL program giving a seg fault 【发布时间】:2012-11-15 22:12:18 【问题描述】:

我正在学习 OpenGL,但由于某种原因,我绘制三角形的程序无法正常工作。代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GL/glfw.h>
#include <glm/glm.hpp>

using namespace glm;

int main()

    if(!glfwInit())
    
        fprintf(stderr, "Failed to initialize GLFW\n");
        return -1;
    

    glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
    glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    if(!glfwOpenWindow(1080, 720, 0, 0, 0, 0, 32, 0, GLFW_WINDOW))
    
        fprintf(stderr, "Failed to open GLFW window\n");
        glfwTerminate();
        return -1;
    

    if(glewInit() != GLEW_OK)
    
        fprintf(stderr, "Failed to initialize GLEW\n");
        return -1;
    

    GLuint VertexArrayID;
    glGenVertexArrays(1, &VertexArrayID);
    glBindVertexArray(VertexArrayID);

    static const GLfloat g_vertex_buffer_data[] = 
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
    ;

    GLuint vertexBuffer;
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

    glfwSetWindowTitle("Tutorial 01");

    glfwEnable(GLFW_STICKY_KEYS);

    do
    
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glVertexAttribPointer(
            0,
            3,
            GL_FLOAT,
            GL_FALSE,
            0,
            (void*)0
        );

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glDisableVertexAttribArray(0);

        glfwSwapBuffers();
    

    while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS &&
          glfwGetWindowParam(GLFW_OPENED));

调试日志:

Debugger name and version: GNU gdb (GDB) 7.5
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:11
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:17
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:18
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:19
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:20
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:22
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:29
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:36
Program received signal SIGSEGV, Segmentation fault.
In ?? () ()
At /home/mike/Programming/OpenGL Tutorials/Opening a window/main.cpp:36
Debugger finished with status 0

【问题讨论】:

你试过断点看看它崩溃的地方吗? 您是否尝试在程序开始时将某些内容打印到stderr,以查看您是否可以读取发送到stderr的内容? 我做了你所说的 DJ,这是第 36 行的段错误:glGenVertexArrays(1, &VertexArrayID);现在的问题是为什么会发生这种情况,我该如何解决。 为了记录@Nicol,我可以毫无问题地写信给stderr。 你正在创建一个核心上下文,你的着色器在哪里? 【参考方案1】:

glewInit() 之后进行显式版本检查:

if( !GLEW_VERSION_3_3 )

    fprintf(stderr, "Insuffcient GL version!\n");
    return -1;

【讨论】:

这只有在你想确保用户安装了正确版本的 glew 时才有意义(在运行时)。在编译时将其作为当前问题的解决方案包含在内是没有意义的 (SIGSEGV main:36:glGenVertexArrays(1, &VertexArrayID))。 编辑添加:@user768417 可能没有针对支持它的 glew 版本进行编译(

以上是关于OpenGL程序给出一个段错误的主要内容,如果未能解决你的问题,请参考以下文章

Numpy C++ 程序总是给出段错误(很可能滥用语法或类型)

在 OpenGL 中为索引缓冲区对象使用结构会导致段错误

glEnableVertexArrayAttrib 生成的段错误

为啥写作主要;在 C 中给出一个段错误

FLTK 绘制像素图给出了段错误

为啥调用 glCreateShader 时这个 OpenGL 着色器分段错误?