Hi, I want to start learning OpenGL. I have searched for some tutorials and here is what I have done:

1. I downloaded the latest version of GLUT
2. I put the DLLs in C:\Windows\System32
3. I put the libs in C:\Program Files (x86)\CodeBlocks\MinGW\lib
4. Put glut.h in C:\Program Files (x86)\CodeBlocks\MinGW\include
5. Open Code::Blocks -> new GLUT project -> Settings/Compiler and Debugger/Linker settings
6. Added C:\Program Files (x86)\CodeBlocks\MinGW\lib\glut32.lib
7. Ran this code:

/*
 * GLUT Shapes Demo
 *
 * Written by Nigel Stewart November 2003
 *
 * This program is test harness for the sphere, cone
 * and torus shapes in GLUT.
 *
 * Spinning wireframe and smooth shaded shapes are
 * displayed until the ESC or q key is pressed.  The
 * number of geometry stacks and slices can be adjusted
 * using the + and - keys.
 */

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>

static int slices = 16;
static int stacks = 16;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
        glTranslated(-2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(-2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireSphere(1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(0,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireCone(1,1,slices,stacks);
    glPopMatrix();

    glPushMatrix();
        glTranslated(2.4,-1.2,-6);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutWireTorus(0.2,0.8,slices,stacks);
    glPopMatrix();

    glutSwapBuffers();
}


static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 :
        case 'q':
            exit(0);
            break;

        case '+':
            slices++;
            stacks++;
            break;

        case '-':
            if (slices>3 && stacks>3)
            {
                slices--;
                stacks--;
            }
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("GLUT Shapes");

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();

    return EXIT_SUCCESS;
}

And I got 76 errors about undefined references.

Dani AI

Generated

ben1996123 already covered the usual installs and , and have pointed to linker/header issues. Persistent "undefined reference" after adding the nominal OpenGL/GLU/GLUT libraries usually means something deeper than a missing filename — most commonly an ABI/format or architecture mismatch rather than a simple forgotten entry in Linker settings.

Common root causes and fixes

  • Many GLUT packages ship Visual Studio import libraries (.lib in COFF format). MinGW’s linker (ld) expects GNU-style import libraries (.a or .dll.a). Using an MSVC .lib with MinGW will produce lots of undefined references even though a .lib file was added. The fix is to use a MinGW-built GLUT/freeglut distribution or create a MinGW import library from the DLL (tools: pexports + dlltool or reimp).
  • Check 32-bit vs 64-bit: on 64-bit Windows, System32 holds 64-bit DLLs; 32-bit DLLs belong in SysWOW64 or in the MinGW\bin used by the toolchain. A 32/64 mismatch causes link/run failures.
  • Confirm the toolchain in Code::Blocks is the MinGW one (Settings → Compiler → Toolchain executables) and that the header sits in include\GL\glut.h (as noted). Import libs should be in MinGW\lib and DLLs in MinGW\bin (or SysWOW64 for 32-bit DLLs on x64 Windows).

Practical troubleshooting checklist

  • Enable verbose build/link output in Code::Blocks and capture the full linker command and the first undefined symbol — that symbol normally points to the exact missing/incorrect library.
  • Replace any MSVC .lib with a MinGW .a (or download a MinGW build of freeglut).
  • If generating an import lib: extract exports from the DLL and create a .a with dlltool; using a prebuilt MinGW package is usually faster.

A typical MinGW-style linkage (using a MinGW freeglut) looks like:

g++ main.cpp -o shapes.exe -I"C:\MinGW\include" -L"C:\MinGW\lib" -lfreeglut -lglu32 -lopengl32

Once MinGW-compatible import libraries and matching-architecture DLLs are in place, the undefined-reference flood normally disappears.

Recommended Answers

All 7 Replies

Did you put the glut.h in the "GL" sub-folder of the "include" folder?

undefined reference indicates that the compilation is fine, but the linking is not. Check which libraries you need to link against. Linking just against glut32.lib is not enough.

undefined reference indicates that the compilation is fine, but the linking is not. Check which libraries you need to link against. Linking just against glut32.lib is not enough.

Normally you'd need opengl32 , glu32 , and glut32 .

Normally you'd need opengl32 , glu32 , and glut32 .

I don't have opengl32.lib. I tried linking glut.lib and glut32.lib but it still didn't work.

GLUT does not itself give you the openGl libraries. opengl32.lib is provided by Microsoft. Search your hard drive for it.

Ok I've linked glu32, glut32 and opengl32, and I still get 76 errors.

Are they still undefined reference errors? Dig out from the error the first function it cannot find and then figure out which library is meant to provide it.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.