Простой код OpenGL всегда вызывает ошибку сегментации (C ++ в Ubuntu, виртуальная машина) - PullRequest
3 голосов
/ 21 сентября 2010

Я только начал пытаться использовать OpenGL в C ++ для класса (ранее я использовал его в Java довольно много). И я начал с того, что пытался написать что-то существенное, я не мог этого сделать, чтобы остановить ошибку Seg, поэтому я написал этот небольшой фрагмент кода, который представляет собой строчку для копирования строк из примера в первой главе Красной книги. Это также сег ошибки. У меня вопрос почему. Я пробовал как eclipse, так и netbeans, у меня в обоих проектах есть библиотека glut.h, я использую 64-разрядную версию Ubuntu 10.4, на виртуальной машине, использующей VMWare, оба gcc и freeglut установлены, оба netbeans и eclipse запустить обычный (не OpenGL) код C ++, который я пишу без ошибок сегментов.

В любом случае вот код:

#include <stdlib.h>
#include <GL/freeglut.h>
#include <stdio.h>

void init(){
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

}
void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,1.0,1.0);
    glBegin(GL_POLYGON);
        glVertex3f(0.25, 0.25, 0.0);
        glVertex3f(0.75,0.25,0.0);
        glVertex3f(0.75,0.75, 0.0);
        glVertex3f(0.25, 0.75, 0.0);
        glEnd();
    glFlush();
}
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(250,250);    //if I comment out this line,
    glutInitWindowPosition(100,100);
    glutCreateWindow(argv[0]);  //this line,
    init();  //this line and the glut main loop line it runs without any errors, but why wouldn't it? It's not doing anything now!
    glutDisplayFunc(display);
    glutMainLoop();    //if I comment out just this line I get illegal instruction instead of segfault but I need this line
    return 0;
}

Резьба [1] 28944 (приостановлено: сигнал: SIGSEGV: ошибка сегментации)
XF86DRIQueryVersion () в 0x7ffff7e7412e XF86DRIQueryExtension () в 0x7ffff7e742c9 0x7ffff7e73c70 0x7ffff7e53ff8 glXGetFBConfigs () в 0x7ffff7e4c71e glXChooseFBConfigSGIX () в 0x7ffff7e4cd97
fgChooseFBConfig () at freeglut_window.c: 205 0x7ffff794a8c7
fgOpenWindow () в freeglut_window.c: 768 0x7ffff794aac8
fgCreateWindow () в freeglut_structure.c: 106 0x7ffff7948f62 glutCreateWindow () в freeglut_window.c: 1,183 0x7ffff794a2a2 main () в потоке [1] 28944 (приостановлено: сигнал: SIGSEGV: ошибка сегментации) XF86DRIQueryVersion () в 0x7ffff7e7412e XF86DRIQueryExtension () в 0x7ffff7e742c9 0x7ffff7e73c70 0x7ffff7e53ff8 glXGetFBConfigs () в 0x7ffff7e4c71e glXChooseFBConfigSGIX () в 0x7ffff7e4cd97
fgChooseFBConfig () at freeglut_window.c: 205 0x7ffff794a8c7
fgOpenWindow () в freeglut_window.c: 768 0x7ffff794aac8
fgCreateWindow () в freeglut_structure.c: 106 0x7ffff7948f62 glutCreateWindow () в freeglut_window.c: 1,183 0x7ffff794a2a2 main () at (проектные материалы здесь): 54 0x40100b

Ответы [ 4 ]

3 голосов
/ 03 февраля 2011

Может помочь: добавить GLUT_DEPTH в glutInitDisplayMode У меня работает с этим флагом, а не без (segfault на glutCreateWindow)

2 голосов
/ 19 июля 2011

У меня была похожая проблема с другим кодом и удаленным использованием Debian 6.0 из Mac OS X 10.6. В рассматриваемой машине использовалась карта Radeon HD 5670 (хотя это не должно быть актуально).

При ближайшем рассмотрении показалось, что что-то с самим OpenGL не работает должным образом, потому что не только мой код дал сбой.

Некоторые из симптомов, с которыми я столкнулся, включают:

  • Программы, использующие сбой OpenGL с SIGSEGV в XF86DRIQueryVersion ()
  • glxinfo / glxgears также аварийно завершает работу с SIGSEGV

Для меня решение было удалить драйвер Radeon fglrx (удалить все пакеты с помощью aptitude) и вместо этого установить драйвер 'radeon'. Затем запустите 'sudo Xorg -configure', чтобы сгенерировать новую конфигурацию, протестируйте ее с помощью 'sudo X -config /root/xorg.conf.new' и скопируйте ее в папку по умолчанию xorg.conf.

После этого программы больше не зависали с SIGSEGV, хотя я получил другую ошибку:

  • glxinfo выдает: Получена ошибка: не удалось найти визуальный RGB GLX или fbconfig
  • glxgears дает: Ошибка: не удалось получить RGB, визуализация с двойной буферизацией

Это, в свою очередь, казалось, связано с прямым рендерингом (DRI), создающим проблемы. Решением этой проблемы было отключить прямой рендеринг, установив «export LIBGL_ALWAYS_INDIRECT = yes». Альтернативой является удаление библиотеки, используемой для DRI (в моем случае это была libgl1-mesa-dri).

Я все еще не совсем уверен, что это решение целом , поскольку драйверы fglxr не должны иметь значения при использовании только glxinfo и glxgears с удаленного терминала. Я подозреваю, что удаление fglxr и установка radeon как-то решили проблему в конфигурации.

Некоторые ссылки, которые я использовал, включают:

2 голосов
/ 21 сентября 2010

Есть ли у вас аппаратное ускорение внутри виртуальной машины?Проверьте используя glxinfo.Авария внутри DRI предполагает, что вы этого не делаете.

1 голос
/ 21 сентября 2010

Я предполагаю, что если вы скомпилируете следующий урезанный пример, вы все равно получите ошибку сегментации:

#include <stdlib.h>
#include <GL/freeglut.h>
#include <stdio.h>

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(250,250);
    glutInitWindowPosition(100,100);
    glutCreateWindow("test window");
    return 0;
}

Поскольку ваша ошибка сегментации происходит в:

fgCreateWindow() at freeglut_structure.c:106 0x7ffff7948f62 glutCreateWindow()

Другими словами, он не может создать окно (не имеет значения, что в нем). Я думаю, что @Matias ответил, что вам нужно включить 3D-ускорение в вашей виртуальной машине? Но это может быть проблема с драйвером дисплея, 32 против 64 бит, или что-то более зловещее, такое как несоответствие между freeglut и вашей версией OpenGl - отсюда мой предыдущий набор вопросов. Не могли бы вы скомпилировать эту урезанную версию и опубликовать результаты?

...