【问题标题】:Declaration of std::string causes a segmentation fault with OpenGLstd::string 的声明导致 OpenGL 出现分段错误
【发布时间】: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(&amp;argc, argv);,那么还是会导致分段错误。

有什么想法吗?

【问题讨论】:

  • 我曾经遇到过类似的问题。我发现添加 g​​lutGet(GLUT_DISPLAY_MODE_POSSIBLE) (如果返回 false 则退出)有帮助。感觉 glutGet() 正在执行一些必要的初始化。但我始终无法真正追查并证明这一点。
  • 您是否使用命令行参数调用?
  • 包括编译器名称、版本和平台
  • 还在这里查看您的其他可能相关的问题:stackoverflow.com/questions/30949880/…,您的系统上的标准 C++ 库似乎有问题。也许您包含的标头和链接/加载的库不匹配,或者这种风格的东西。

标签: c++ opengl


【解决方案1】:

我也有类似的问题,但我的是在 Linux 上。你是在 Linux 还是 Windows 上?有没有安装显卡驱动?

就我而言,我在安装了nVidiaUbuntu 上运行,我注意到当我将我的程序与位于/usr/lib/x86_64-linux-gnulibGL.so 链接时,它会导致分段错误。然后我还发现有另一个libGL.so位于/usr/lib/nvidia-352,这将链接而不会崩溃。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2015-06-10
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多