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++ 程序总是给出段错误(很可能滥用语法或类型)