Anda di halaman 1dari 7

INGENIERA TCNICA EN INFORMTICA DE GESTIN PRCTICAS DE INTRODUCCIN A LA INFORMTICA GRFICA

Compilacin de Programas en UNIX

1.- Objetivos
El objetivo de este manual es que aprendas a construir programas en C, C++ para el sistema operativo UNIX. Cuando termines de leer este manual sers capaz de lo siguiente: !" Construir un archivo Makefile para realizar la compilacin de programas en C, C++ que requieran el uso de varios archivos de programa.

2.- Compilacin de programas


Cuando programes en UNIX, necesitars cuatro programas para escribir y depurar tu cdigo escrito en C, C++: 1) un editor, 2) un compilador-enlazador, 3) un depurador y 4) la orden make. 1. El editor permite escribir los programas y los archivos Makefile. Se puede usar como editor cualquier procesador de texto que permita grabar texto sin formato, es decir, sin cdigos de control tales como subrayado, negrita, etc. Podemos usar un entorno integrado desde el que se pueden invocar al compilador y al make. Esto permite una identificacin de errores mucho ms rpida y cmoda. Sin embargo, cualquier editor de texto nos servir igualmente. 2. El compilador-enlazador permite compilar los programas en C, C++ para generar cdigo objeto y enlazar ese cdigo con las bibliotecas que se necesiten para construir el programa ejecutable. Utilizaremos el gcc. 3. El depurador permite ejecutar paso a paso un programa defectuoso (que contenga errores de ejecucin) y comprobar el estado de variables y estructuras de datos. UNIX dispone en el propio sistema operativo del depurador llamado gdb, sin embargo usaremos un entorno grfico llamado ddd el cual est basado en el gdb pero es mucho ms intuitivo y fcil de usar.

Pg. 1

Prcticas Introduccin Informtica Grfica

Juan Jos Jimnez Delgado

4. Por ltimo, el programa make facilita el uso de mltiples archivos de programa fuente para un mismo programa ejecutable, ya que automticamente analiza las interdependencias entre archivos fuentes para realizar la compilacin selectiva de slo aquellos archivos que hayan sido modificados desde la ltima compilacin.

3.- El compilador-enlazador
Uno de los compiladores de C, C++ ms extendidos para UNIX se llama gcc. Se encarga tanto de la compilacin de los archivos fuente, como del enlazado de los ejecutables. Su uso ms elemental es gcc seguido del archivo que se quiere compilar, por ejemplo la orden: gcc programa.cc compila el contenido del archivo fuente llamado programa.cc y genera el programa ejecutable llamado programa.out. El compilador tiene muchas opciones que permiten flexibilizar su uso. Las ms importantes se muestran en la Tabla 1. Por ejemplo, lo primero que querrs cambiar ser el nombre que el compilador asigna por defecto al ejecutable. Para ello se usa la opcin -o seguida del nombre que quieras dar al programa. Por ejemplo: gcc programa.cc -o programa Ahora el resultado no ser un ejecutable llamado a.out, sino un ejecutable llamado programa. Otras opciones importantes son -Wall y -Werror. El compilador, por defecto, slo te muestra mensajes de error cuando encuentra errores de compilacin y no cuando encuentra warnings. Sin embargo, aunque los warnings no impiden que se genere el ejecutable, lo deseable es que en tus programas no haya ninguno. Para ello debes decir al compilador que te muestre todos los warnings, de forma que puedas corregir el programa para eliminarlos. La opcin -Wall indica al compilador que muestre los warnings pero si los hay no impide el enlazado del programa, mientras que la opcin -Werror si lo impide. Si quieres usar un depurador para trazar tu programa y descubrir por qu se producen errores en l en tiempo de ejecucin, debes decir al compilador que prepare al ejecutable para ello con la opcin -g. Si no compilas tu programa con esa opcin, no se genera la tabla de smbolos necesaria para poder usar el depurador.

Prcticas Introduccin Informtica Grfica

Pg. 2

Opcin
-o <nombre> -Wall

Descripcin
El resultado de la compilacin no se llama a.out (el valor por defecto), sino <nombre> El compilador avisa de todos los warnings (mensajes de error que no impiden compilar y enlazar el programa), que aparezcan en el cdigo fuente El compilador no enlaza un programa que tenga warnings. Trata un conjunto de warnings como un error Durante la compilacin se genera una tabla de smbolos que permite trazar el programa con ayuda de un depurador. Los programas compilados con esta opcin son ms lentos, por lo que slo debe usarse durante la puesta a punto de los mismos Aquellos archivos que no contienen una funcin main no pueden ser ejecutables, por ello deben compilarse con esta opcin que indica al compilador que slo realice la compilacin Se genera cdigo objeto optimizado para una mayor velocidad Permite enlazar una biblioteca externa, por ejemplo OpenGL Indica el camino en el que buscar las bibliotecas externas Indica el camino en el que se deben buscar los archivos para incluir con la directiva #include

-Werror -g

-c

-O (o mayscula) -l<biblioteca> -L<path> -I<path>

Tabla 1. Opciones ms frecuentes del compilador-enlazador gcc

Normalmente los programas compilados con la opcin de depuracin -g son un poco ms lentos, por lo que, cuando termines de depurar tu programa debes compilarlo sin esta opcin. El compilador compila el programa y a continuacin intenta enlazarlo. Sin embargo, esto slo es posible cuando en tu archivo de programa haya una funcin main. Si has estructurado tu programa de forma que el cdigo fuente no est en un nico archivo sino en varios, debes compilar sin enlazar los archivos "de biblioteca", y compilar y enlazar el archivo principal. Para compilar sin enlazar se usa la opcin -c. Por ejemplo, podemos programar una clase llamada vdTimeMeter cuya implementacin se encuentra en dos archivos: vdTimeMeter.h y vdTimeMeter.cc. Para probar dicha clase se ha construido un pequeo programa que la utiliza llamado vdTest-01.cc. En este caso, la compilacin debe realizarse con las siguientes ordenes: gcc -g -Werror -c -o vdTimeMeter.o vdTimeMeter.cc gcc -g -Werror -o vdTest-01 vdTimeMeter.o vdTest-01.cc Si la compilacin tiene xito, es decir, si no hay errores, entonces en el directorio en el que hayas ejecutado las rdenes anteriores habr dos archivos objeto llamados vdTimeMeter.o y vdTest-01.o, que son el resultado de compilar sin enlazar los archivos fuente vdTimeMeter.cc y vdTest-01.cc; y un archivo ejecutable llamado vdTest-01 resultado de enlazar los archivos objeto anteriores. En la ltima lnea se realiza tanto la compilacin de vdTest-01.cc para producir su objeto, como el enlazado de todos los objetos para producir el ejecutable. La compilacin anterior tambin podra haberse hecho de la forma:

Pg. 3

Prcticas Introduccin Informtica Grfica

Juan Jos Jimnez Delgado

gcc -g -Werror -c -o vdTimeMeter.o vdTimeMeter.cc gcc -g -Werror -c -o vdTest-01.o vdTest-01.cc gcc -g -Werror -o vdTest-01 vdTimeMeter.o vdTest-01.o En este caso, primero se genera el cdigo objeto correspondiente al programa principal y a continuacin se enlazan los dos programas objeto para formar el ejecutable. Una vez depurado el programa y comprobado que no tiene ningn error en tiempo de ejecucin puedes decir al compilador que lo compile de forma que sea lo ms eficiente posible. Para ello slo has de sustituir la opcin -g por la opcin -O (letra o mayscula). Con esta opcin, el compilador genera un programa optimizado que se ejecuta ligeramente ms rpido. Tambin existen las opciones -O2 y -O3 que aaden ms capacidades de optimizacin. Si necesitas incluir alguna biblioteca del sistema en el enlazado de tu programa, debes especificarlo con la opcin -l<biblioteca>. Por ejemplo, si tu programa necesita usar alguna funcin de la biblioteca matemtica debes enlazarlo con la opcin -lm que llama a la biblioteca libm.so que es el nombre de la biblioteca matemtica. Fjate que los nombres de los archivos que contienen a las bibliotecas siempre comienzan por lib y terminan por .so Si un archivo de biblioteca no se encuentra en ninguno de los directorios que UNIX reserva tpicamente para ellas (/lib, /usr/lib, etc.), entonces el compilador no podr encontrarlo para hacer el enlazado. Para ello est la opcin -L<path> que permite decir al enlazador que busque las bibliotecas tambin en el directorio especificado por <path>. Por ejemplo, un programa que use la biblioteca libX11.so (biblioteca de programacin de X-Window) debe compilarse con las opciones: -L/usr/X11R6/1ib lX11 en la mayora de los sistemas, pero puede ser necesario buscarlas si no se encuentran en ese directorio. En linux este es el camino donde suelen encontrarse las libreras, y las que posiblemente utilicemos son: -L /usr/X11R6/lib lm lXmu lXi lXext lX11 Las libreras necesarias para OpenGL tienen varias implementaciones distintas que suelen venir en algunas de las distribuciones de Linux. Debemos incluir uno de los dos grupos de libreras que siguen: -L /usr/X11R6/lib lGL lGLU lglut o -L /usr/X11R6/lib lMesaGL lMesaGLU -lglut

Prcticas Introduccin Informtica Grfica

Pg. 4

4.- La orden make


Lo normal es que una biblioteca de clases est compuesta por decenas de clases, cada una de ellas implementada en un archivo fuente diferente. Ello permite una depuracin y puesta a punto ms fcil, as como reutilizar el cdigo usndolo en otras bibliotecas. Sin embargo, la compilacin de este tipo de programas requiere escribir varias rdenes que suelen ser bastante largas y por tanto difciles de teclear. En el ejemplo de la pgina anterior que tan solo tiene dos archivos, hay que escribir tres rdenes. Adems, a menudo, un cambio en un archivo fuente slo afecta a otros pocos archivos fuentes con los que si se recompilan todos se pierde tiempo intilmente. Por todo ello UNIX dispone de la orden make que permite racionalizar el proceso de compilacin y enlazado de programas extensos. Bsicamente la orden make analiza cuales son los ficheros de cdigo fuente que se han modificado desde la ltima compilacin y compila slo aquellos que realmente necesitan ser compilados dejando los dems archivos objeto intactos. Adems este proceso es automtico, por lo que el usuario no tiene que escribir cada vez todas las lneas de compilacin. El uso ms simple de make consiste en suministrarle una lista de dependencias y/o instrucciones de compilacin en un archivo de texto llamado Makefile y que debe encontrarse en el directorio en el que se encuentren los archivos de cdigo fuente. As cuando en ese directorio escribas la orden make, dicha orden buscar el archivo llamado Makefile y siguiendo sus instrucciones analizar qu archivos deben ser recompilados y realizar la compilacin tal y como hayas especificado. Una dependencia es una relacin que existe entre dos ficheros de forma que un fichero se considera actualizado siempre que el otro (del cual depende el primero) tenga una fecha de compilacin inferior a la del primero. Por ejemplo, si el archivo vdTest.cc incluye al fichero vdTest.h, no se puede considerar actualizado al fichero vdTest.o si vdTest.cc o vdTest.h han sido modificados despus de la ltima compilacin en la que se cre vdTest.o. Se dice, en ese caso, que vdTest.o depende de vdTest.h y de vdTest.cc. La sintaxis con la que se escriben dependencias en un archivo Makefile es la siguiente: <dependiente>: <referencial> [<referencia2>...] <instruccionesDeCompilacin> donde <dependiente> es el nombre del archivo dependiente y <referenciaX> son los nombres de los archivos de los cuales depende. La dependencia del ejemplo anterior se escribira como: vdTest.o: vdTest.cc vdTest.h gcc -g -c -Werror -o vdTest.o vdTest.cc MUCHO CUIDADO!!!, las instrucciones de la segunda lnea de una dependencia deben ir sangradas con un tabulador. Si se emplean espacios, o no se escriben sangradas, se produce un error al ejecutar la orden make.

Pg. 5

Prcticas Introduccin Informtica Grfica

Juan Jos Jimnez Delgado

Para simplificar un archivo Makefile, se pueden usar macros (nombres de variables). Una macro se define de la forma: <NOMBRE-MACRO> = <valor> y se usa de la forma: $ (<NOMBRE-MACRO>) Si no se usan macros, el hecho tan simple de cambiar una opcin de compilacin (por ejemplo, pasar del modo depuracin -g, al modo optimizacion -o) implica modificar varias lneas, mientras que si se usan macros slo hay que modificar el valor de la macro. Un fichero makefile llamado Makefile.P1 que corresponde al programa vdTest-01 utiliza macros para realizar la compilacin. Este Makefile puede ser compilado llamando a la orden make de la siguiente manera: make f Makefile.P1 La opcin f le indica a la orden make que debe compilar el fichero que le demos a continuacin. Si no se especifica esta opcin busca un fichero en el directorio en el que se encuentre con el nombre makefile o Makefile. Para saber ms acerca de las opciones de la orden make consulte el manual en lnea de Linux (man make). El fichero Makefile.generico puede utilizarse a modo de plantilla para poder compilar casi cualquier programa, sustituyendo lo necesario.

Prcticas Introduccin Informtica Grfica

Pg. 6

5.- Makefile.generico
# Makefile generico # Macros FLAGS = -Wall -Werror -g -p # -g debugger, -p profiler GCC = gcc $(FLAGS) BIN = ../bin/ TEST = ../test/ GUION = ../guion/ LIB3D = ../lib3D/ EJECUTABLE = ... DIR_EJECUT = $(TEST) X_LIBS = -L /usr/X11R6/lib -lm -lXmu -lXi -lXext -lX11 #MESA_LIBS = -L /usr/X11R6/lib -lMesaGL -lMesaGLU -lglut GL_LIBS = -L /usr/X11R6/lib -lGL -lGLU -lglut LIBS = $(X_LIBS) $(GL_LIBS) # Enlazado del programa $(EJECUTABLE): $(LIB3D)vd3DP.o \ $(LIB3D)vd2DP.o \ ... $(DIR_EJECUT)$(EJECUTABLE).o $(GCC) -o $(BIN)$(EJECUTABLE) $(LIBS) \ $(LIB3D)vd3DP.o \ $(LIB3D)vd2DP.o \ ... $(DIR_EJECUT)$(EJECUTABLE).o # Compilacion de los archivos (dependencias) $(LIB3D)vd3DP.o: $(LIB3D)vd3DP.cc $(LIB3D)vd3DP.h $(GCC) -c -o $(LIB3D)vd3DP.o $(LIB3D)vd3DP.cc $(LIB3D)vd2DP.o: $(LIB3D)vd2DP.cc $(LIB3D)vd2DP.h $(GCC) -c -o $(LIB3D)vd2DP.o $(LIB3D)vd2DP.cc ... $(DIR_EJECUT)$(EJECUTABLE).o: $(DIR_EJECUT)$(EJECUTABLE).cc $(GCC) -c -o $(DIR_EJECUT)$(EJECUTABLE).o $(DIR_EJECUT)$(EJECUTABLE).cc

Pg. 7

Prcticas Introduccin Informtica Grfica

Anda mungkin juga menyukai