nov 25 2010
Bibliotecas en C/C++ [Actualizado]
Cuando uno empieza a programar, la forma de modularización del nuestro código es bien pobre; es mas!, tanto así que hasta a veces metemos todo en el main. Luego que superamos la fase de meter todo el main, comenzamos a modularizar mediantes funciones, las cuales las ubicamos dentro del mismo archivo. Hasta aquí ya sabemos programar; y pues ya no aparecen los errores en tiempo de compilación, pero nos falta algo aun para hacer proyectos mas grandes, ese algo, es aprender a usar y crear bibliotecas o librerías.
En C++ y en algunos otros lenguajes de programación, se pueden crear 2 tipos de bibliotecas: dinámicas y estáticas. En Windows, las primeras toman la extensión *.dll y las segundas *.lib o *.a. En linux cambia la extensión de estas por *.so y *.a, respectivamente. Si quieren saber mas sobre el uso de bibliotecas en linux, pueden pasarse por el site de chuidiang.com (sitio que, cuando empecé a programar, me sacó de muchos apuros).
Ahora, para comprender un poco mas de las bibliotecas hay que comprender un poco como funciona el proceso de hacer un programa en un lenguaje de programación compilado, desde su codificación hasta su ejecución. Repasando un poco de teoría, hay que saber que cuando creamos un fichero fuente, este al compilar crea ficheros objeto con extensión .o u .obj. Haciendo un paréntesis, quisiera decir que cuando comencé en la programación me malacostumbré a que con un botón “Build all” o “Make all”, me tuviera listo todo el proyecto y listo para ejecutar y distribuir. Es por eso, que antes de usar cualquier IDE –creo yo- hay que conocer que sucede al hacer clic sobre estos botones. Como había dicho líneas atrás, al trabajar con un lenguaje compilado, al compilar se crean ficheros objeto y NO ejecutables. Los ejecutables son creados recién por el linker, el cual junta todos los ficheros objeto -que no es mas que código de maquina- para poder crear un ejecutable. Si alguna vez han programado en lenguaje ensamblador, se podrán dar cuenta que el proceso es parecido, solo que en lugar del compilador, esta el ensamblador(MASM, TASM, NASM, etc.). Como dijo mi profesor del curso de arquitectura de computadoras, ya con los ficheros objeto tenemos una pista para poder comunicar varios lenguajes de programación, pero ese es otro tema. Por ultimo, también está el no menos importante “librarian”, que es el que se encarga de extraer los ficheros objeto de las bibliotecas, para que así el linker pueda crear el fichero ejecutable apropiadamente.
Figura 1. Proceso de compilación
Figura 2. Proceso de creación de un ejecutable en C no detallado
La figura 1 muestra el proceso de compilación y esto un poco de teoría de los lenguajes de programación, que la verdad a veces se muestra muy abstracta y muy aburrida, A MENOS QUE lo pongamos en practica. Quizás la mayoría de nosotros al querer usar una librería en C++, tenemos que buscar un pequeño tutorial de como instalarlo si estamos usando Dev C++ o si usamos Codeblocks, Visual C++, etc. Pero, como les decía antes, esto va contra mi pensamiento de hacer clic sobre botones que me esconden su funcionalidad. Debido a esto, cogeremos uno de estos IDE, pero NO USAREMOS EL IDE, sino SOLAMENTE EL COMPILADOR CON EL QUE VIENE. En este caso usaremos el Codeblocks, el cual viene con el G++(compilador de C++ de GNU) y además usaremos el API OpenGL y GLUT.
El API OPENGL ya viene incluido en los últimos sistemas operativos; y como toda api, tiene sus bibliotecas estáticas y dinámicas, solo hay que saber cuales son necesarias. En este caso para nuestro ejemplo necesitamos opengl, glu y glut. Entonces, como estamos en windows debemos buscar las librerías estáticas y dinámicas y los headers con los mismos nombres. Generalmente, las librerías dinámicas llevan el mismo nombre y terminan en 32, si nuestro windows es de 32 bits y las librerías estáticas comienzan con libNOMBREDELALIBRERIA32.a, como mi computadora es de 32 bits, encontré los siguientes archivos:
- libopengl32.a
- libglu32.a
- libglut32.lib
Como OPENGL y GLU ya vienen con el compilador y/o el sistema operativo, no es necesario especificarle al compilador donde están las librerías dinámicas, ni los headers; ya que el compilador al instalarse, siempre setea la variable de entorno PATH y pone ahi las rutas. Si quieren probar usando solo el compilador y el linker, prueben, debería funcionarles normal, solo que habría que indicarle al compilador donde estan los .dll y los headers de opengl y glu.
Para glut, si hay q bajarse la librería completa, es decir: headers, librerias estaticas y dinámicas y luego decirle al compilador donde las puede encontrar para que al momento de linkear, pueda crear el ejecutable sin problemas.
Finalmente, todo esto que he escrito, lo pondremos en practica, como les dije antes, usando el compilador gcc. Para esto, solo hay q saber que parámetros hay q darle al compilador. En este caso sería:
g++ -omain main.c -I"D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad" -L"D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad" -lopengl32 -lglu32 –lglut32
donde –I indica donde encontrar los headers, –L donde buscar las librerías y –l, es la llamada al linker para que cree el ejecutable incluyendo los ficheros objeto que se encuentran en “opengl32, glu32 y glut32”, los cuales van a ser manipulados por el librarian.
Olvidaba que hay que tener en cuenta que el archivo g++.exe esta en la carpeta /bin de Codeblocks y que para que podamos llamarlo directamente hay que agregar dicha ruta al path, manualmente o en todo caso poner toda la ruta del archivo, ejemplo:
“C:\Archivos de programa\CodeBlocks\MinGW\bin\g++.exe” -omain main.c -I"D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad" -L"D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad" -lopengl32 -lglu32 –lglut32
Para no aburrirlos mas, pondré un ejemplo de programa de opengl que me pasaron en un minicurso de opengl que lleve en el congreso pasado de la UPAO. Lo principal es que pueden editar este código desde el bloc de notas y compilarlo desde línea de comandos (en este caso use un .bat).
Aquí pueden bajar el ejemplo:
Ejemplo OPENGL con bloc de notas
Hasta otro post =)




