ESCUELA DE INGENIERÍA DE SISTEMAS
DEPARTAMENTO DE COMPUTACIÓN
PROGRAMACIÓN 2
SEMESTE B-2010
PRÁCTICA DE LABORATORIO 1
Uso de herramientas básicas: El compilador
Introducción
Según Wikipedia GCC actualmente significa GNU Compiler Collection (colección de compiladores GNU) es un conjunto de compiladores creados por el proyecto GNU. GCC es software libre y lo distribuye la FSF bajo la licencia GPL.
Estos compiladores se consideran estándar para los sistemas operativos derivados de UNIX, de código abierto o también de propietarios, como Mac OS X. GCC requiere el conjunto de aplicaciones conocido como binutils para realizar tareas como identificar archivos objeto u obtener su tamaño para copiarlos, traducirlos o crear listas, enlazarlos, o quitarles símbolos innecesarios.
Originalmente GCC significaba GNU C Compiler (compilador GNU para C), porque sólo compilaba el lenguaje C. Posteriormente se extendió para compilar C++, Fortran, Ada y otros.
Sintaxis.
gcc [ opción | archivo ]
...
g++
[ opción | archivo ] ...
Las opciones van precedidas de un guión, como es habitual en UNIX, pero las opciones en sí pueden tener varias letras; no pueden agruparse varias opciones tras un mismo guión. Algunas opciones requieren después un nombre de archivo o directorio, otras no. Finalmente, pueden darse varios nombres de archivo a incluir en el proceso de compilación.
- c
Realiza el preprocesamiento y compilación, obteniendo el
archivo en código objeto1;
no realiza el enlazado necesario para obtener el ejecutable.
-o
archivo
Indica el nombre del archivo de salida,
cualesquiera sean las etapas cumplidas.
-Iruta
Especifica la ruta hacia el directorio donde
se encuentran los archivos indicados para incluir en el programa
fuente. No lleva espacio entre la I y la ruta, ejemplo:
-I/usr/include
-L
especifica la ruta hacia el directorio donde se
encuentran los archivos de biblioteca con el código objeto de las
funciones referenciadas en el programa fuente. No lleva espacio
entre la L y la ruta, ejemplo: -L/usr/lib
-g
incluye en
el ejecutable generado la información necesaria para poder rastrear
los errores usando un depurador, tal como GDB (GNU Debugger).
Trabajo práctico
1.- Guarde el siguiente programa en un archivo tipo texto cuyo nombre sea programa1.c en un subdirectorio llamado practica1a, si no existe dicho directorio proceda a crearlo.
#include <stdio.h> |
|
int main() { |
printf("Tamaño en bytes de variables simples:\n"); |
printf("El tamaño de char (caracter), es: %d\n", sizeof(char)); |
printf("El tamaño de short (entero corto), es: %d\n", sizeof(short)); |
printf("El tamaño de int (entero), es: %d\n", sizeof(int)); |
printf("El tamaño de long (entero largo), es: %d\n", sizeof(long)); |
printf("El tamaño de float (float), es: %d\n", sizeof(float)); |
printf("El tamaño de double (doble precisión), es: %d\n", sizeof(double)); |
|
printf("\nTamaño en bytes de apuntadores a variables simples:\n"); |
printf("El tamaño de char * (apuntador a caracter), es: %d\n", sizeof(char *)); |
printf("El tamaño de short * (apuntador a entero corto), es: %d\n", sizeof(short *)); |
printf("El tamaño de int * (apuntador a entero), es: %d\n", sizeof(int *)); |
printf("El tamaño de long * (apuntador a entero largo), es: %d\n", sizeof(long *)); |
printf("El tamaño de float * (apuntador a float), es: %d\n", sizeof(float *)); |
printf("El tamaño de double * (apuntador a doble precisión), es: %d\n", sizeof(double *)); |
|
return(0); |
} |
1.1.- Cámbiese al subdirectorio practica1a. Actualmente en el directorio solo debe existir el archivo programa1.c.
1.2.- Para compilar el programa fuente en lenguaje C y obtener el archivo en código objeto, use la siguiente instrucción:
gcc -c programa1.c
Si el programa no tiene errores de sintaxis se debe haber creado un programa en código objeto llamado programa1.o
1.3.- Obtención del programa ejecutable,
1.3.1.- Para crear un programa ejecutable a partir de un programa en código objeto se puede usar la siguiente instrucción:
gcc programa1.o
se generará un ejecutable llamado a.out. No es un nombre muy intuitivo, si queremos cambiar el nombre, pondremos
gcc
programa1.o -o programa1
Antes de continuar borre los archivos a.out, programa1.o y programa1
1.3.2.- Para crear el programa ejecutable a partir de un programa en lenguaje C se puede usar la siguiente instrucción:
gcc programa1.c
si no hay errores se generará un ejecutable llamado a.out. De nuevo no es un nombre muy intuitivo, si queremos cambiar el nombre, pondremos
gcc
programa1.c -o programa1
Antes de continuar cámbiese al directorio inmediato superior
2.- Cree un subdirectorio llamado practica1.b y guarde el siguiente archivo con el nombre areas.h
#ifndef AREAS |
#define AREAS |
|
#define PI 3,14159265 |
|
float areaRectangulo(float,float); |
float areaCuadrado(float,float); |
float areaTriangulo(float, float); |
float areaCirculo(float); |
|
#endif |
El siguiente programa como areas.c
#include <areas.h> |
|
float areaRectangulo(float base,float altura){ |
return( base*altura); |
} |
|
float areaTriangulo(float base, float altura){ |
return(base*altura/2.0); |
} |
|
|
float areaCirculo(float radio){ |
return(PI*radio*radio); |
} |
El siguiente programa como calculoAreas.c
#include <stdio.h> |
#include <areas.h> |
|
int main(){ |
float baseRectangulo; |
float alturaRectangulo; |
float baseTriangulo; |
float alturaTriangulo; |
float radioCirculo; |
|
printf("Introduzca la base del Rectangulo: "); |
scanf("%f", &baseRectangulo); |
printf("Introduzca la altura del Rectangulo: "); |
scanf("%f", &alturaRectangulo); |
|
printf("Introduzca la base del Triangulo: "); |
scanf("%f", &baseTriangulo); |
printf("Introduzca la altura del Triangulo: "); |
scanf("%f", &alturaTriangulo); |
|
printf("Introduzca radio del Circulo: "); |
scanf("%f", &radioCirculo); |
|
printf("Area del Rectangulo %f\n", areaRectangulo(baseRectangulo, alturaRectangulo)); |
printf("Area del Triangulo %f\n", areaTriangulo(baseTriangulo, alturaTriangulo)); |
printf("Area del Circulo %f\n", areaCirculo(radioCirculo)); |
|
return(0); |
} |
2.1.- Convierta los archivos areas.c y calculoAreas.c en programas en código objeto usando:
gcc -c areas.c
gcc -c calculoAreas.c
Al ejecutar la primera instrucción obtendrá varios errores de sintaxis, observe especialmente en
areas.c:1:19: error: areas.h: No existe el fichero ó directorio
este error indica que la orden de inclusión de la línea 19 no puede llevarse a cabo, ya que no es posible encontrar el archivo archivo areas.h. Esto ocurre ya que el compilador busca los archivos a incluir en el directorio por defecto, usualmente /usr/include. Una de las soluciones de este error es indicarle al gcc sitios alternativos para buscar los archivos a incluir, esto se hace con la opción -I seguido por el directorio donde se encuentran los archivos faltantes. La forma correcta será:
gcc -c -I. areas.c
gcc -c -I. calculoAreas.c
El punto seguido de -I indica que el sitio alterno de búsqueda de archivos a incluir es el directorio actual, representado en este caso por un punto.
Para obtener el archivo ejecutable a partir los los archivos en código objeto basta con usar:
gcc -o calculoAreas calculoAreas.o areas.o
3.- Copie el código fuente del programa areas.c a un archivo llamado areasv2.c. Modifique este último con el fin de calcular el área de un circulo por medio de la función potencia (pow) incluida en la biblioteca de funciones matemáticas, usualmente esta biblioteca se encuentra definida en /usr/lib/libm.a. La declaraciones de las funciones de esta biblioteca se encuentran usualmente en /usr/include/math.h. Este archivo debe ser incluido agregando al inicio del programa areasv2.c la siguiente línea:
#include<math.h>
Para hacer el llamado de la funcion pow2 se debe cambiar la línea:
return(PI*radio*radio);
por
return(PI*pow(radio,2));
Guarde los cambios y obtenga el programa en código objeto de areas.c usando:
gcc -c -I. areasv2.c
Para crear el archivo ejecutable que utilice la nueva version del calculo de áreas puede usar:
gcc -o calculoAreasv2 areasv2.o calculoAreas.o
Es importante destacar que en esta nueva versión no fue necesario compilar de nuevo calculoAreas.c, sólo se enlazo con las funciones almacenadas en areasv2.o.
En este último ejemplo se utilizó la función pow almacenada en la biblioteca matemática de forma implicita, En algunas versiones de gcc es necesario hacer el enlace en forma explicta, esto se hace colocando:
gcc -o calculoAreasv2 areasv2.o calculoAreas.o /usr/lib/libm.a
o de la forma abreviada
gcc -o calculoAreasv2 areasv2.o calculoAreas.o -lm
donde -lnombre le indica al compilador que busque las funciones no definidas en el directorio por defecto para almacenar las bibliotecas, usualmente /usr/lib, y en ese directorio buscar la biblioteca libnombre.a. Es decir -l también indica que la biblioteca debe tener un nombre que se inicia con la palabra lib y termina en .a.
Es posible agregar nuevo sitios de búsqueda de bibliotecas de funciones, esto se hace con la opción -L seguida por la ruta donde está almacenada la biblioteca a enlazar.
4.- Diseñe y construya un programa en C que imprima los números entre 0 y N, donde N es un número entero mayor que 0. Para esto se debe usar una función definida como:
primo(x) = 0 , si y solo si x es entero mayor que 0 y no primo.
primo(x) = 1, si y solo si, x es entero mayor que 0 y primo.
primo(x) = -1, en cualquier otro caso
Nota:
Si se desea compilar programas en C++, hay que cambiar de compilador, usar g++ en vez de gcc, las principales opciones son las mismas.
Enlaces:
Wikipedia: http://es.wikipedia.org/wiki/GNU_Compiler_Collection
GCC GNU: http://gcc.gnu.org/
Linux Man Pages: http://linuxmanpages.com/man1/gcc.1.php
Realizado por:
Rafael Rivas Estrada, rafael@ula.ve
versión 1.0
Noviembre, 2009
Revisado por:
Hilda Contreras, hyelitza@ula.ve
Gilberto Diaz, gilberto@ula.ve
1En programación, el código objeto es el resultado de la compilación del código fuente. Puede ser en lenguaje máquina o bytecode, y puede distribuirse en varios archivos que corresponden a cada código fuente compilado. Luego un enlazador se encarga de juntar todos los archivos de código objeto para obtener el programa ejecutable.
2Si el sistema de manuales en línea se encuentra instalado puede comprobar la sintaxis de la función pow ejecutando desde una consola de comandos:
man pow