【发布时间】:2015-06-20 04:15:17
【问题描述】:
考虑一个非常简单的 OpenGL 程序:
#include <GL/glut.h>
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Test");
glutDisplayFunc(RenderScene);
glClearColor(0.3f, 0.3f, 0.3f, 0.0f);
glutMainLoop();
return 0;
}
这编译并运行良好,按预期显示灰色窗口。
然后,在 OpenGL 处理之前,我在 main 函数中引入了三个变量。代码变为:
#include <string>
#include <GL/glut.h>
static void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
}
int main(int argc, char** argv)
{
int x = 5;
char y = 'a';
std::string z = "abc";
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(500, 500);
glutCreateWindow("OpenGL Test");
glutDisplayFunc(RenderScene);
glClearColor(0.3f, 0.3f, 0.3f, 0.0f);
glutMainLoop();
return 0;
}
编译这很好,但如果我运行它,我会收到分段错误错误。现在,如果我注释掉 std::string z = "abc"; 行,那么它运行良好,没有任何错误。
因此,由于某种原因,在这里声明字符串变量会导致分段错误,但不会导致任何其他变量类型。
如果我删除所有 OpenGL 代码,那么它运行良好。但是如果我把除了一行之外的所有OpenGL代码都去掉了,比如glutInit(&argc, argv);,那么还是会导致分段错误。
有什么想法吗?
【问题讨论】:
-
我曾经遇到过类似的问题。我发现添加 glutGet(GLUT_DISPLAY_MODE_POSSIBLE) (如果返回 false 则退出)有帮助。感觉 glutGet() 正在执行一些必要的初始化。但我始终无法真正追查并证明这一点。
-
您是否使用命令行参数调用?
-
包括编译器名称、版本和平台
-
还在这里查看您的其他可能相关的问题:stackoverflow.com/questions/30949880/…,您的系统上的标准 C++ 库似乎有问题。也许您包含的标头和链接/加载的库不匹配,或者这种风格的东西。