Четверг, 02.05.2024, 04:33
Приветствую Вас Гость | RSS
_nast
Главная | Каталог статей | Регистрация | Вход
Форма входа

Меню сайта
Категории раздела
Статейки [4]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Друзья сайта
  • Природа Орловщины
  • Главная » Статьи » OpenCL » Статейки

    GLEW & MinGW Windows

    Проблема такая:

    При компиляции исходников в которых вызываются функции из glew линкер ругается примерно так

    ogl.o:ogl.cpp:(.text+0x32): undefined reference to `_imp____glewGenBuffers'.....

    Решение:

    Устанавливаем msys (я установил вместе с mingw с помощью вот этой прилады http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/). Далее качаем исходники glew (http://sourceforge.net/projects/glew/files/glew/1.5.8/glew-1.5.8.zip/download), распаковываем их например в путь_по_которому_установлен_msys/1.0/msys/home/пользователь_под_которым_вы_сидите. Запускаем msys.bat, заходим в каталог  glew-1.5.8 и вводим make. Если все ОК в папке lib лежат glew32.dll, копируем его в system32 (например), libglew32.a и libglew32.dll.a в mingw/lib

    Компилируем наш исходник, запускаем и ... программа падает либо ничего не происходит. Все дело в том что надо настроить контекст рендеринга OpenGL. Делается это примерно так (для Windows приложений):


    #include <stdio.h>
    #include <GL/glew.h>

    #if defined(_WIN32)
    #include <GL/wglew.h>
    #endif

    typedef struct GLContextStruct
    {
        HWND wnd;
        HDC dc;
        HGLRC rc;
    } GLContext;

    void InitContext(GLContext* ctx)
    {
        ctx->wnd=NULL;
        ctx->dc=NULL;
        ctx->rc=NULL;
    }

    bool CreateContext(GLContext* ctx)
    {
        WNDCLASSA wc;
        PIXELFORMATDESCRIPTOR pfd;
        int retPixFormat;

        if (!ctx) return false;
        ZeroMemory(&wc, sizeof(WNDCLASS));
        wc.hInstance = GetModuleHandle(NULL);
        wc.lpfnWndProc = DefWindowProc;
        wc.lpszClassName = "GLEW";
        if (RegisterClassA(&wc)==0) return false;
        ctx->wnd = CreateWindowA("GLEW", "GLEW", 0, CW_USEDEFAULT, CW_USEDEFAULT,
                                                CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
        GetModuleHandle(NULL), NULL);
        if (!ctx->wnd) return false;
        ctx->dc=GetDC(ctx->wnd);
        if (!ctx->dc) return false;

        ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));
        pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        retPixFormat=ChoosePixelFormat(ctx->dc, &pfd);
        if (retPixFormat==0) return false;

        if (!SetPixelFormat(ctx->dc, retPixFormat, &pfd)) return false;
        ctx->rc = wglCreateContext(ctx->dc);
        if (!ctx->rc) return false;
        if (!wglMakeCurrent(ctx->dc, ctx->rc)) return false;
       

        return true;
    }

    void DestroyContext(GLContext* ctx)
    {
        if (!ctx) return;
        if (ctx->rc) wglMakeCurrent(NULL, NULL);
        if (ctx->rc) wglDeleteContext(wglGetCurrentContext());
        if (ctx->wnd && ctx->dc) ReleaseDC(ctx->wnd, ctx->dc);
        if (ctx->wnd) DestroyWindow(ctx->wnd);
        UnregisterClassA("GLEW", GetModuleHandle(NULL));
    }

    int main()
    {
        GLContext ctx;
        InitContext(&ctx);
       
        if (!CreateContext(&ctx))
        {
            printf("Error!");
            return -1;
        }

        glewInit();
        printf("%s",(char*)glGetString(GL_EXTENSIONS));

        DestroyContext(&ctx);
        return 0;
    }

    Компилируем (выполняется в msys "оболочке")

    gcc -c -O2 -Wall -W -o ogl.o ogl.cpp 
    gcc -O2 -Wall -W -o ogl.exe ogl.o -L/mingw/lib -lglew32 -lopengl32 -lgdi32

    Основная здесь функция CreateContext. Кстати код взят(немного исзменен) из исходника visualinfo.c, находящегося в папке src сырцов glew, там вы можете посмотреть код для Mac и Linux.

    Хотите кросплатформенности используйте Qt - QGLWidget, там так же настраивается контекст, примерно таким же путем (можно исходники посмотреть).

    Категория: Статейки | Добавил: _nast (10.03.2011)
    Просмотров: 3096 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:
    Copyright MyCorp © 2024
    Конструктор сайтов - uCoz