Linux GLEW с GLX segfault (дамп ядра)

Я пытаюсь настроить в Linux очень простую программу с основным профилем OpenGL 3.2 и GLEW. Я попробовал это с помощью этой статьи.

Это мой код:

#define GLEW_STATIC
#include <iostream>
#include <cstdio>
#include <string>
#include <GL/glew.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <GL/gl.h>
#include <GL/glx.h>

//#include <GL/glut.h>
#include "stb_image_write.h"
#include <cstdlib>
#include <GL/glfw.h>


static float _viewPortHeight = 30;
static float _viewPortWidth = 10;

typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
typedef Bool (*glXMakeContextCurrentARBProc)(Display*, GLXDrawable, GLXDrawable, GLXContext);
static glXCreateContextAttribsARBProc glXCreateContextAttribsARB = NULL;
static glXMakeContextCurrentARBProc   glXMakeContextCurrentARB   = NULL;

int main (int argc, char *argv[]){
    glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB" );
    glXMakeContextCurrentARB   = (glXMakeContextCurrentARBProc)   glXGetProcAddressARB( (const GLubyte *) "glXMakeContextCurrent");
    Display *display = XOpenDisplay(NULL);
    if (display == NULL){
        std::cout  << "error getting the X display";
        return -1;
     }

    static int visualAttribs[] = {None};
    int numberOfFrameBufferConfigurations;
    GLXFBConfig *fbConfigs = glXChooseFBConfig(display, DefaultScreen(display), visualAttribs, &numberOfFrameBufferConfigurations);

     int context_attribs[] = {
          GLX_CONTEXT_MAJOR_VERSION_ARB ,3,
          GLX_CONTEXT_MINOR_VERSION_ARB, 2,
          GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_DEBUG_BIT_ARB,
          GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,None
     };

    std::cout << "initialising context...";
    GLXContext openGLContext = glXCreateContextAttribsARB(display, fbConfigs[0], 0, True, context_attribs);

    int pBufferAttribs[] = {
        GLX_PBUFFER_WIDTH, 32,
        GLX_PBUFFER_HEIGHT, 32,
        None
    };

    GLXPbuffer pbuffer = glXCreatePbuffer(display, fbConfigs[0], pBufferAttribs);
    XFree(fbConfigs);
    XSync(display, False);
    if(!glXMakeContextCurrent(display, pbuffer, pbuffer, openGLContext)){
        std::cout << "error with content creation";
        return -1;
    }
    glXMakeCurrent(display, pbuffer, openGLContext);

    GLenum error = glewInit();
    if (error != GLEW_OK){
       std::cout << "error with glew init()\n";
    }else{
        std::cout << "glew is ok\n\n";
    }
    GLuint test;
    GLuint framebuffer;
    glGenFramebuffers(1, &framebuffer);

    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    std::string path("output.png");
    exportToPath(path);

    return 0;
 }

Вывод, который я получаю, таков:

Инициализация контекста... glew в порядке

Ошибка сегментации (дамп ядра)

Строка, которая вызывает проблему, находится в вызове glGenFrameBuffers, который также является первым вызовом функций, созданных GLEW. Что-то здесь очень не так, но я не могу понять, что и почему.

Может кто-то указать мне верное направление?


person csotiriou    schedule 18.02.2014    source источник
comment
Где объявление framebuffer ?   -  person Dan    schedule 18.02.2014
comment
Ты прав. Извини за это. Я отредактировал код.   -  person csotiriou    schedule 18.02.2014


Ответы (2)


glew.h уже включает gl.h и с доступной GLX glx.h… а затем использует магию макросов, чтобы согнуть некоторые символы. Я предлагаю вам удалить строки

#include <GL/gl.h>
#include <GL/glx.h>

И просто используйте

#include <GL/glew.h>

С исходным включением после включения GLEW часть магии макросов может быть потеряна, и вы в конечном итоге получите неправильно связанный символ, что приведет к сбою.


На заметку: почему вы включаете заголовки GLFW и GLUT? Если вы намерены использовать голый GLX, то они вам не нужны и не должны их включать.

person datenwolf    schedule 18.02.2014

Нашел проблему, решением которой кажется добавление 'glewExperimental' = GL_TRUE перед вызовом glewInit();

person csotiriou    schedule 24.02.2014