используя mingw для кросс-компиляции приложения opengl для windows - PullRequest
3 голосов
/ 06 октября 2009

Хейя, я использую Linux (Ubuntu),

У меня возникли некоторые проблемы с этим. Я попытался скачать glut32.dll и вставить его в каталог lib / mingw, а также настроить соответствующие заголовки в include /, однако - хотя компиляция в порядке - у линкера есть серьезная проблема с поиском символов.

как мне это сделать? Как создать приложение OpenGL для Windows, используя Mingw?

спасибо,

Ответы [ 2 ]

2 голосов
/ 06 октября 2009

В мире Windows, чтобы связать что-то с DLL, вам нужна «библиотека импорта». Вы можете думать о них как о статических библиотеках с функциями-заглушками, которые предоставляют символы DLL. Вам нужно искать libglut32.a.

Если вы не можете найти это, возможно, в Интернете есть инструмент преобразования библиотеки импорта из Visual C ++ в mingw ... (Давненько я не нуждался в подобных вещах, поэтому, возможно, я просто мечтал об этой части до.)

0 голосов
/ 11 июня 2017

На самом деле вам даже не нужен GLUT, он уже есть, нужно только связать его с libopengl32.a, который свяжет исполняемый файл с собственным opengl32.dll в системе.

typedef struct RENDER_SURFACE {
    void (*redraw)(struct RENDER_SURFACE*);
    HWND hWnd;
    HINSTANCE hInstance;
    HDC hdc;
    HGLRC hrc;
    int width;
    int height;
    int pix_fmt;
    float light_position[4];
    float light_ambient[4];
    float light_diffuse[4];
    float light_specular[4];
    float light_shininess;
} RENDER_SURFACE;

static LRESULT AppProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    RENDER_SURFACE* rs = (RENDER_SURFACE*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    if (uMsg == WM_CREATE)
    {
        RECT rc;
        PIXELFORMATDESCRIPTOR pfd;
        rs = (RENDER_SURFACE*)((LPCREATESTRUCT)lParam)->lpCreateParams;
        SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)rs);
        rs->hWnd = hWnd;
        rs->hdc = GetDC(hWnd);
        GetClientRect(hWnd, &rc);
        rs->width = rc.right-rc.left;
        rs->height = rc.bottom-rc.top;
        memset(&pfd, 0, sizeof(pfd));
        pfd.nSize = sizeof(pfd);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 32;
        rs->pix_fmt = ChoosePixelFormat(rs->hdc, &pfd); 
        if (!rs->pix_fmt)
        {
            MessageBox(hWnd, "ChoosePixelFormat FAILED!", "Fatal Error", MB_OK | MB_ICONSTOP);
            DestroyWindow(hWnd);
            return -1;
        }
        SetPixelFormat(rs->hdc, rs->pix_fmt, &pfd);
        rs->hrc = wglCreateContext(rs->hdc);
        wglMakeCurrent(rs->hdc, rs->hrc);
        /* SwapBuffers(rs->hdc); */
        return 0;
    }
    else if (uMsg == WM_PAINT)
    {
        /* other stuffs */
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
...