My first OpenGL program

Hello,

Please find below the code for my first simple OpenGL program, but it gives me the following error:

g4b1e1@ubuntu:~/programming$ gcc -lGL -lglut cube.c -o cube
/tmp/ccCQkTKm.o:cube.c:function display: error: undefined reference to ‘gluLookAt’
collect2: ld returned 1 exit status
g4b1e1@ubuntu:~/programming$

Program Code:

#include <GL/glut.h>
#include <GL/gl.h>
#include <stdlib.h>

void reshape(int, int);
void display(void);
void keyboard(unsigned char, int, int);

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition (100, 100);
glutCreateWindow(argv[0]);
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}

void reshape(int w, int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
glMatrixMode(GL_MODELVIEW);
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);

glLoadIdentity();
//glMatrixMode(GL_PROJECTION);
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
glScalef(1.0,2.0,1.0);
glutWireCube(1.0);
glFlush();
}

void keyboard(unsigned char key, int x, int y)
{
switch(key) {
case 27: exit(10);
break;
}
}

I tried to browse for the solution, but coludn’t get it.

Kindly guide.

Hello,
add -lGLU to link against glu library:


gcc -o cube cube.c -lGL -lGLU -lglut

Thanks a ton KOWAL…
It worked…

Do we have a way to link the same permanently; instead of punching in it with the command everytime.

Yes, we have, it’s called Makefile (or project settings if You use IDE)

I use this for most of my small projects.
Just copy-paste code below to file named ‘Makefile’ in your project directory,
and adjust EXECUTABLE, HEADERS and OBJS variables to match your files.
(By default I keep my source files in src directory, and headers in src/include)
Change compiler flags in DEBUG_FLAGS and RELEASE_FLAGS as You wish.
Add Your libs in LIBS variable, library dirctories in LIBDIRS (for example -L…/lib),
whenever You wish to compile program, type ‘make’ .


.PHONY: clean rebuild compressed doc
VPATH = src src/include

GPP    = g++
GCC    = gcc
LINK   = gcc
DOCGEN = doxygen

INCDIRS = -I./src/include
LIBDIRS = 
LIBS    = -lm -lGL -lGLU -lglut

RELEASE_FLAGS = -Wall -O2 -flto
DEBUG_FLAGS   = -Wall -O0 -g

RELEASE_LINK_FLAGS = -flto
DEBUG_LINK_FLAGS   = -g

IFLAGS = $(INCDIRS)
CFLAGS = $(IFLAGS) $(DEBUG_FLAGS) 
LFLAGS = $(LIBS)   $(DEBUG_LINK_FLAGS)
UPXFLAGS = --best --ultra-brute

#----------------file utils---------------
RM    = rm -rf
CAT   = cat
ECHO  = echo
TAR   = tar
GZIP  = gzip
BZIP  = bzip2
XZ    = xz
STRIP = strip
UPX   = upx
#-----------------------------------------


EXECUTABLE = cube
OBJS       = cube.o
HEADERS    = 

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJS)
	$(LINK) -o $(EXECUTABLE) $(OBJS) $(LFLAGS)

%.o : %.c $(HEADERS)
	$(GCC) $(CFLAGS) -c -o $@ $<

%.o : %.cpp $(HEADERS)
	$(GPP) $(CFLAGS) -c -o $@ $<

clean:
	$(RM) $(EXECUTABLE) $(OBJS) *~ src/*~ src/include/*~

rebuild: clean all

compressed: all
	$(UPX) $(UPXFLAGS) $(EXECUTABLE)

doc:
	$(DOCGEN)