   Simple OpenGL problem
  HiI have a really simple problem with my really simple OpenGL application. I am working off a book and I am trying to run their most basic programs and I am having a really bad time with it. Look at my code and then at my error:main.cpp:#define WIN32_EXTRA_LEAN#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include "CGfxOpenGL.h"bool exiting = false;long windowWidth = 800;long windowHeight = 600;long windowBits = 32;bool fullscreen = false;HDC hDC;CGfxOpenGL *g_glRender = NULL;void SetupPixelFormat(HDC hDC){    int pixelFormat;    PIXELFORMATDESCRIPTOR pfd =    { sizeof(PIXELFORMATDESCRIPTOR),  // size  1, // version  PFD_SUPPORT_OPENGL |   // OpenGL window  PFD_DRAW_TO_WINDOW |   // render to window  PFD_DOUBLEBUFFER, // support double-buffering  PFD_TYPE_RGBA,    // color type  32,// prefered color depth  0, 0, 0, 0, 0, 0, // color bits (ignored)  0, // no alpha buffer  0, // alpha bits (ignored)  0, // no accumulation buffer  0, 0, 0, 0,  // accum bits (ignored)  16,// depth buffer  0, // no stencil buffer  0, // no auxiliary buffers  PFD_MAIN_PLANE,   // main layer  0, // reserved  0, 0, 0,// no layer, visible, damage masks    };    pixelFormat = ChoosePixelFormat(hDC, &pfd);    SetPixelFormat(hDC, pixelFormat, &pfd);}LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){    static HDC hDC;    static HGLRC hRC;    int height, width;    // dispatch messages    switch (uMsg)    {  case WM_CREATE:    // window creation   hDC = GetDC(hWnd);   SetupPixelFormat(hDC);   //SetupPalette();   hRC = wglCreateContext(hDC);   wglMakeCurrent(hDC, hRC);   break;    case WM_DESTROY:  // window destroy    case WM_QUIT:    case WM_CLOSE:   // windows is closing   // deselect rendering context and delete it   wglMakeCurrent(hDC, NULL);   wglDeleteContext(hRC);   // send WM_QUIT to message queue   PostQuitMessage(0);   break;    case WM_SIZE:   height = HIWORD(lParam);   // retrieve width and height   width = LOWORD(lParam);   g_glRender->SetupProjection(width, height);   break;    case WM_ACTIVATEAPP:   // activate app   break;    case WM_PAINT:    // paint   PAINTSTRUCT ps;   BeginPaint(hWnd, &ps);   EndPaint(hWnd, &ps);   break;    case WM_LBUTTONDOWN:   // left mouse button   break;    case WM_RBUTTONDOWN:   // right mouse button   break;    case WM_MOUSEMOVE:// mouse movement   break;    case WM_LBUTTONUP:// left button release   break;    case WM_RBUTTONUP:// right button release   break;    case WM_KEYUP:   break;    case WM_KEYDOWN:   int fwKeys;   LPARAM keyData;   fwKeys = (int)wParam;    // virtual-key code    keyData = lParam;// key data    switch(fwKeys)   {   case VK_ESCAPE:  PostQuitMessage(0);  break;   default:  break;   }   break;    default:   break;    }    return DefWindowProc(hWnd, uMsg, wParam, lParam);}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){    WNDCLASSEX windowClass;// window class    HWND  hwnd;  // window handle    MSG   msg;   // message    DWORD dwExstyle;  // Window Extended style    DWORD dwstyle;    // Window style    RECT  windowRect;    g_glRender = new CGfxOpenGL;    windowRect.left=(long)0;    // Set Left Value To 0    windowRect.right=(long)windowWidth; // Set Right Value To Requested Width    windowRect.top=(long)0;// Set Top Value To 0    windowRect.bottom=(long)windowHeight;   // Set Bottom Value To Requested Height    // fill out the window class structure    windowClass.cbSize= sizeof(WNDCLASSEX);    windowClass.style = CS_HREDRAW | CS_VREDRAW;    windowClass.lpfnWndProc= MainWindowProc;    windowClass.cbClsExtra = 0;    windowClass.cbWndExtra = 0;    windowClass.hInstance  = hInstance;    windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);  // default icon    windowClass.hCursor    = LoadCursor(NULL, IDC_ARROW); // default arrow    windowClass.hbrBackground   = NULL;    // don't need background    windowClass.lpszMenuName    = NULL;    // no menu    windowClass.lpszClassName   = "GLClass";    windowClass.hIconSm    = LoadIcon(NULL, IDI_WINLOGO); // windows logo small icon    // register the windows class    if (!RegisterClassEx(&windowClass))   return 0;    if (fullscreen)    // fullscreen?    {   DEVMODE dmScreenSettings;    // device mode   memset(&dmScreenSettings,0,sizeof(dmScreenSettings));   dmScreenSettings.dmSize = sizeof(dmScreenSettings);    dmScreenSettings.dmPelsWidth = windowWidth;    // screen width   dmScreenSettings.dmPelsHeight = windowHeight; // screen height   dmScreenSettings.dmBitsPerPel = windowBits;   // bits per pixel   dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;   //    if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)   {  // setting display mode failed, switch to windowed  MessageBox(NULL, "Display mode failed", NULL, MB_OK);  fullscreen = FALSE;    }    }    if (fullscreen)    // Are We Still In Fullscreen Mode?    {   dwExstyle=WS_EX_APPWINDOW;   // Window Extended style   dwstyle=WS_POPUP;   // Windows style   ShowCursor(FALSE);  // Hide Mouse Pointer    }    else    {   dwExstyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;   // Window Extended style   dwstyle=WS_OVERLAPPEDWINDOW;// Windows style    }    AdjustWindowRectEx(&windowRect, dwstyle, FALSE, dwExstyle);// Adjust Window To True Requested Size    // class registered, so now create our window    hwnd = CreateWindowEx(NULL,   // extended style   "GLClass", // class name   "BOGLGP - Chapter 2 - OpenGL Application", // app name   dwstyle | WS_CLIPCHILDREN |   WS_CLIPSIBLINGS,   0, 0, // x,y coordinate   windowRect.right - windowRect.left,   windowRect.bottom - windowRect.top, // width, height   NULL, // handle to parent   NULL, // handle to menu   hInstance, // application instance   NULL);// no extra params    hDC = GetDC(hwnd);    // check if window creation failed (hwnd would equal NULL)    if (!hwnd)   return 0;    ShowWindow(hwnd, SW_SHOW);// display the window    UpdateWindow(hwnd);  // update the window    g_glRender->Init();    while (!exiting)    {   g_glRender->Prepare(0.0f);   g_glRender->Render();   SwapBuffers(hDC);   while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))   {  if (!GetMessage (&msg, NULL, 0, 0))  { exiting = true; break;  }  TranslateMessage (&msg);  DispatchMessage (&msg);   }    }    delete g_glRender;    if (fullscreen)    {   ChangeDisplaySettings(NULL,0);// If So Switch Back To The Desktop   ShowCursor(TRUE);   // Show Mouse Pointer    }    return (int)msg.wParam;}CGfxOpengl.cpp:#ifdef _WINDOWS#include &lt;windows.h&gt;#endif#include &lt;gl/gl.h&gt;#include &lt;gl/glu.h&gt;#include &lt;math.h&gt;#include "CGfxOpenGL.h"// disable implicit float-double casting#pragma warning(disable:4305)CGfxOpenGL::CGfxOpenGL(){}CGfxOpenGL::~CGfxOpenGL(){}bool CGfxOpenGL::Init(){  // clear to black background    glClearColor(0.0, 0.0, 0.0, 0.0);    m_angle = 0.0f;    return true;}bool CGfxOpenGL::Shutdown(){    return true;}void CGfxOpenGL::SetupProjection(int width, int height){    if (height == 0)// don't want a divide by zero    {   height = 1; }    glViewport(0, 0, width, height);   // reset the viewport to new dimensions    glMatrixMode(GL_PROJECTION);  // set projection matrix current matrix    glLoadIdentity();   // reset projection matrix    // calculate aspect ratio of window    gluPerspective(52.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);    glMatrixMode(GL_MODELVIEW);   // set modelview matrix    glLoadIdentity();   // reset modelview matrix    m_windowWidth = width;    m_windowHeight = height;}void CGfxOpenGL::Prepare(float dt){    m_angle += 0.1f;}void CGfxOpenGL::Render(){    // clear screen and depth buffer    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glLoadIdentity();    // move back 5 units and rotate about all 3 axes    glTranslatef(0.0, 0.0, -5.0f);    glRotatef(m_angle, 1.0f, 0.0f, 0.0f);    glRotatef(m_angle, 0.0f, 1.0f, 0.0f);    glRotatef(m_angle, 0.0f, 0.0f, 1.0f);    // lime greenish color    glColor3f(0.7f, 1.0f, 0.3f);    // draw the triangle such that the rotation point is in the center    glBegin(GL_TRIANGLES);   glVertex3f(1.0f, -1.0f, 0.0f);   glVertex3f(-1.0f, -1.0f, 0.0f);   glVertex3f(0.0f, 1.0f, 0.0f);    glEnd();}CGfxOpenGL.h:#ifndef __GL_COMPONENT#define __GL_COMPONENT#define PI 3.14159#define TWO_PI PI*2.0#define HALF_PI PI/2.0class CGfxOpenGL{private:int m_windowWidth;int m_windowHeight;float m_angle;public:CGfxOpenGL();virtual ~CGfxOpenGL();bool Init();bool Shutdown();void SetupProjection(int width, int height);void Prepare(float dt);void Render();};#endifand my error:   [Linker error] undefined reference to `gluPerspective@32'   ld returned 1 exit status   I:\OpenGL Source Codes\Makefile.win [Build Error]  [OpenGL.exe] Error 1 I have a suspission I don't have a library it calls for....EDIT: whats the command for code?????   
  looks like your not linking the glu header-lopengl32 -lglu32 -lglaux -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32those are everything i have linked in my example, not sure which ones are even necessary tho.   ;  That fixed it! THanks!   ;  Just as a head's up, WIN32_EXTRA_LEAN doesn't do anything.   