Linking OpenGL under gcc

Hi ,

I am trying to compile an OpenGL program with glut using gcc but I am having linking problems.
I found the include files in /usr/include/X11/mesa/GL and I guess the lib files is located in /usr/X11R6/lib.
So I tried the following line below:
gcc xxx.c -I/usr/include/X11/mesa/GL -L/usr/X11R6/lib -lglut -lGLU -lGL
The compiler is telling me that he can not find GLU or GL. (It does not complain about glut…)

What is going on ?
Is it lacking of lib files ?

It is important to say that I just find the libglut.so in /usr/X11R6/lib .
Is it supposed to have libgl or libglu too ?

Originally posted by humberto:
Hi ,
It is important to say that I just find the libglut.so in /usr/X11R6/lib .
Is it supposed to have libgl or libglu too ?

Uhm. “Yes”

Sounds like an incomplete/wrong install.

try this:
gcc xxx.c -I/usr/include/X11/mesa/GL -L/usr/X11R6/lib -lMesaGLU -lMesaGL
I think you will need some more:
-lXext -lX11 -lm -lglut -lXi -lXmu

Thanx Stefan,

Now It is working fine in Caldera Distributions.
For my Red Hat 6.2 Linux I tried another path for -I switch.

I have wrote a bash script to increase the development of openGL. The script helps people to compile and link Mesa 3D library.
save the text to a file cc.sh and change it to executable by chmod a+x cc.sh Then type ./cc.sh --help to see how to use it to include OpenGL library properly. It supports OpenGL 3.5, 4.0.
If you are interested in 3D Math visualization , visit my projects : http://sourceforge.net/projects/mathdev/

#!/bin/bash

The shell script was created to compile the c++ source file *.cpp, *.c, *.cxx

, and debug using the GNU debuggin tools such as gdb and gprof

if [ -z “$1” ];
then
echo -e “Missing argument 1
usage: $0 [ filename without .cpp ] [ OPTIONS ]
Type $0 --help for command line options”
exit
fi

The script is :

message of --help

helpMsg="usage: $0 [ filename without .cpp ] [ OPTIONS ]

The bash script accepts the following options :

	-lFilename

			include the library while linking.

			This -l option is different from the -l in gcc compiler.

			It does not search standard system directories but only

			the full filename specified explicitly. For example,

			cc.sh -lmy.o includes my.o while linking. -lmy does not

			search the file libmy.a

	-p

			include the PLIB library,  [http://plib.sourceforge.net/](http://plib.sourceforge.net/

)

	--Mesa4Dir=DIR

			change the default directory of Mesa 3D 4.0 from

			/usr/local/Mesa-4.0 to DIR

	

	-m4

			compile and link using the gcc options for Mesa 3D 4.0

	

	--Mesa35Dir=DIR

			change the default directory of Mesa 3D 3.5 from

			/usr/local/Mesa35 to DIR

	

	-m35

			compile and link using the gcc options for Mesa 3D 3.5

	

	-glui

			include the GLUI library,  [http://www.cs.unc.edu/~rademach/glui/](http://www.cs.unc.edu/~rademach/glui/

)

	-d

			add debugging options for gcc compiler"

compile=

command to compile

cc=“c++”

compile options

cflags="-W -Wall"
link=

command to link

ccld="$cc"

libraries to include

libs=

link options

ldflags="-W -Wall"

start the specific options

debugging options

db="-a -g -pg"

directories of Mesa 3D library

Mesa4Dir="/usr/local/Mesa-4.0"
Mesa35Dir="/usr/local/Mesa35"

loop through all the arguments to determine the directory of Library

for arg in $@ ;
do
case $arg in
# print help message and quit
–help)
echo -e $helpMsg
exit
;;
# find the directory of Mesa 3D 4.0
–Mesa4Dir=)
Mesa4Dir="echo $arg | sed -e 's/--Mesa4Dir=//'"
;;
# find the directory of Mesa 3D 3.5
–Mesa35Dir=
)
Mesa35Dir="echo $arg | sed -e 's/--Mesa35Dir=//'"
;;
esac
done

options for Mesa 3D 4.0

options to compile source code using Mesa 3D 4.0

cflagsM4="-DHAVE_CONFIG_H -I. -I$Mesa4Dir -I$Mesa4Dir/include -DNDEBUG -g -Wall -fomit-frame-pointer -ffast-math -fstrict-aliasing -malign-loops=2 -malign-jumps=2 -malign-functions=2 -D_REENTRANT -DPTHREADS -c"

options to link Mesa 3D 4.0 library

ldflagsM4="-g -Wall -fomit-frame-pointer -ffast-math -fstrict-aliasing -malign-loops=2 -malign-jumps=2 -malign-functions=2 -D_REENTRANT -DPTHREADS"

options to include Mesa 3D 4.0 library

libsM4="$Mesa4Dir/src-glut/libglut.la $Mesa4Dir/si-glu/libGLU.la $Mesa4Dir/src/libGL.la -lm"

command to link Mesa 3D library

ldM="/bin/sh $Mesa4Dir/libtool --mode=link c++"

options for GLUI

GLuiDir="/usr/local/Mesa-4.0/src-glui/lib/"

options to include the GLUI library

libsGLUI="-L$GLuiDir -lglui"

options to include PLIB library

libsPLIB="-lglut -lGLU -lGL -L/usr/X11/lib -lX11 -lXext -lXmu -lm -lplibssg -lplibsl -lplibpu -lplibfnt -lplibsg -lplibul -lplibnet"

options for Mesa 3D 3.5

options to compile source code using Mesa 3D 3.5

cflagsM35="-DHAVE_CONFIG_H -I. -I$Mesa35Dir -I$Mesa35Dir/include -DNDEBUG -I$Mesa35Dir/util -I$Mesa35Dir/src/X86 -g -Wall -ffast-math -fexpensive-optimizations -fstrict-aliasing -malign-loops=2 -malign-jumps=2 -malign-functions=2 -D_REENTRANT -DPTHREADS -c"

options to link Mesa 3D 3.5 library

ldflagsM35="-g -Wall -ffast-math -fstrict-aliasing -malign-loops=2 -malign-jumps=2 -malign-functions=2 -D_REENTRANT -DPTHREADS"
libsM35="$Mesa35Dir/si-glu/.libs/libGLU.so -L$Mesa35Dir/src $Mesa35Dir/src/.libs/libGL.so -L/usr/X11R6/lib $Mesa35Dir/src-glut/.libs/libglut.so -L$Mesa35Dir/si-glu $Mesa35Dir/src/.libs/libGL.so $Mesa35Dir/src/OSmesa/.libs/libMesaOS.so -lSM -lICE -lXmu -lXext -lXi -lX11 -lpthread -lm -Wl,–rpath -Wl,$Mesa35Dir/si-glu/.libs -Wl,–rpath -Wl,$Mesa35Dir/src/.libs -Wl,–rpath -Wl,$Mesa35Dir/src-glut/.libs -Wl,–rpath -Wl,$Mesa35Dir/src/OSmesa/.libs"

loop through all the arguments

for arg in $@ ;
do
case $arg in
# case of debugging option
-d)
cflags="$cflags $db"
ldflags="$ldflags $db"
;;
# case for Mesa 3D 4.0
-m4)
cflags="$cflags $cflagsM4"
ldflags="$ldflags $ldflagsM4"
libs="$libs $libsM4"
ccld="$ldM"
;;
# case for inclusion of PLIB
-p)
libs="$libs $libsPLIB"
;;
# case for inclusion of GLUI library
-glui)
libs="$libs $libsGLUI"
;;
# case for Mesa 3D 3.5
-m35)
cflags="$cflags $cflagsM35"
ldflags="$ldflags $ldflagsM35"
libs="$libs $libsM35"
ccld="$ldM"
;;
# case for inclusion of addition library files
-l*)
libs="$libs echo $arg | sed -e 's/-l//'"
;;
esac
done

check if the $1.o exists to prevent it from being overwritten

if [ -f $1.o ];
then
echo -e “Attempted to overwrite $1.o
Script exits”
exit
fi

start to compile

compile="$cc $cflags -c"
link="$ccld $ldflags $libs"
if [ -f $1.cpp ];
then
$compile $1.cpp

case of the .c file

elif [ -f $1.c ];
then
$compile $1.c

case of the .cxx file

elif [ -f $1.cxx ];
then
$compile $1.cxx
else
echo -e “$1.c, $1.cpp, or $1.cxx file not found”
fi

start to link

if [ -f $1.o ];
then
$link -o $1 $1.o
# move or remove the object file after linking
if [ -d ./.libs ]
then
mv --force $1.o ./.libs/
else
rm --force $1.o
fi
fi

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.