GCC compile has undefined references despite previously functional linking Ubuntu

23,957

I'm guessing ld (the linker) has been changed to work a bit differently.

Put your libraries after the source file

 gcc T1.c -lm -lGL -lGLU -lglut 

Or apt-get install binutils-gold , apparently the new gold linker will still process dependent shared libraries even if they appear first on the command line.

Share:
23,957
user975391
Author by

user975391

Updated on October 15, 2020

Comments

  • user975391
    user975391 over 3 years

    it seems I can no longer compile my code in GCC post Ubuntu 11.10 update, despite linking in the libraries with -l. Compiling with:

    gcc -lm -lGL -lGLU -lglut T1.c

    (The two libraries i'm trying to link and have as includes are glut and math)

    All the libraries and header files are where they're supposed to be (they haven't gone anywhere since the update) and i've checked all my relevant package installations. In addition here are my environment variables and they seem to be in order:

    PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

    C_INCLUDE_PATH=/usr/include

    I don't think it's a problem with the code as i'm unable to compile files I successfully compiled yesterday. But i'll link it anyway just in case:

        #include <math.h>
        #include <GL/glut.h>
    
        const int  WIDTH=640;
        const int HEIGHT=480;
        const float NEAR_CLIP=0.1f;
        const float FAR_CLIP=100.0f;
        const double INC_ROTATE=5;
        double rotate=0;
    
        void rotateObject() {
                rotate+=INC_ROTATE;
        }
    
        void update() {
                //rotateObject();
        }
    
        void drawAxes() {
            double x = 1.5, y = 1.5, z = 1.5;
            glLineWidth(4);
            glBegin(GL_LINES);
              glColor3d(1,0,0);
              glVertex3d(0,0,0);
              glVertex3d(x,0,0);
              glColor3d(0,1,0);
              glVertex3d(0,0,0);
              glVertex3d(0,y,0);
              glColor3d(0,0,1);
              glVertex3d(0,0,0);
              glVertex3d(0,0,z);
            glEnd();
            glLineWidth(1);
        }
    
        void render() {
                glClear(GL_COLOR_BUFFER_BIT);
                glLoadIdentity();
                gluLookAt(1.2,1.0,2.5,0.0,0.0,0.0,0.0,1.0,0.0);
                drawAxes();
                glColor3d(1,1,1);
                glRotated(rotate,0,0,1);
                glutWireCube(1);
        }
    
        void display() {
                update();
                render();
        }
    
        void reshape(int width, int height) {
                float fAspect=0;
                float fovy=(M_PI/3);
                float top=tan(fovy*0.5)*NEAR_CLIP;
                float bottom=top;
                float left=fAspect*bottom;
                float right=fAspect*top;
    
                glViewport(0,0,width,height);
                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                glFrustum(left,right,bottom,top,NEAR_CLIP, FAR_CLIP);
                glMatrixMode(GL_MODELVIEW);
    
        }
    
        int main(int argc, char **argv) {
    
                glClearColor(0,0,0,1);
                glutInit(&argc, argv);
                glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
            glutInitWindowPosition(100,100);
            glutInitWindowSize(320,320);
            glutCreateWindow("T1");
    
            glutDisplayFunc(display);
            glutReshapeFunc(reshape);
            glutIdleFunc(display);
    
            glutMainLoop();
    
                return 1;
        }
    

    Error messages:

         T1.c:(.text+0x63): undefined reference to `glLineWidth'
         T1.c:(.text+0x6d): undefined reference to `glBegin'
         T1.c:(.text+0x82): undefined reference to `glColor3d'
         T1.c:(.text+0x93): undefined reference to `glVertex3d'
         T1.c:(.text+0xa5): undefined reference to `glVertex3d'
         T1.c:(.text+0xba): undefined reference to `glColor3d'
         T1.c:(.text+0xcb): undefined reference to `glVertex3d'
         T1.c:(.text+0xe1): undefined reference to `glVertex3d'
         T1.c:(.text+0xf6): undefined reference to `glColor3d'
         T1.c:(.text+0x107): undefined reference to `glVertex3d'
         T1.c:(.text+0x11d): undefined reference to `glVertex3d'
         T1.c:(.text+0x122): undefined reference to `glEnd'
         T1.c:(.text+0x12f): undefined reference to `glLineWidth'
         /tmp/cc4VqRwQ.o: In function `render':
         T1.c:(.text+0x143): undefined reference to `glClear'
         T1.c:(.text+0x148): undefined reference to `glLoadIdentity'
         T1.c:(.text+0x18a): undefined reference to `gluLookAt'
         T1.c:(.text+0x1b1): undefined reference to `glColor3d'
         T1.c:(.text+0x1ce): undefined reference to `glRotated'
         T1.c:(.text+0x1db): undefined reference to `glutWireCube'
         /tmp/cc4VqRwQ.o: In function `reshape':
         T1.c:(.text+0x22e): undefined reference to `tan'
         T1.c:(.text+0x28a): undefined reference to `glViewport'
         T1.c:(.text+0x294): undefined reference to `glMatrixMode'
         T1.c:(.text+0x299): undefined reference to `glLoadIdentity'
         T1.c:(.text+0x2da): undefined reference to `glFrustum'
         T1.c:(.text+0x2e4): undefined reference to `glMatrixMode'
         /tmp/cc4VqRwQ.o: In function `main':
         T1.c:(.text+0x30b): undefined reference to `glClearColor'
         T1.c:(.text+0x31e): undefined reference to `glutInit'
         T1.c:(.text+0x328): undefined reference to `glutInitDisplayMode'
         T1.c:(.text+0x337): undefined reference to `glutInitWindowPosition'
         T1.c:(.text+0x346): undefined reference to `glutInitWindowSize'
         T1.c:(.text+0x350): undefined reference to `glutCreateWindow'
         T1.c:(.text+0x35d): undefined reference to `glutDisplayFunc'
         T1.c:(.text+0x367): undefined reference to `glutReshapeFunc'
         T1.c:(.text+0x374): undefined reference to `glutIdleFunc'
         T1.c:(.text+0x379): undefined reference to `glutMainLoop'
         collect2: ld returned 1 exit status
    

    I honestly have no clue why gcc can't find the required source files. Any help you could supply would be greatly appreciated, thanks in advance.

    EDIT:

    I'm using freeglut Added error messages

  • kristianp
    kristianp about 12 years
    Thank you, I have spent a day trying to work out why my program doesn't compile on 11.10! Can you expand on why this change has happened?