Проблема такая: При компиляции исходников в которых вызываются функции из 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, там так же настраивается контекст, примерно таким же путем (можно исходники посмотреть).
|