Las bibliotecas (libraries en inglés) son conjuntos de funciones ya convertidas a código objeto y agrupadas dentro de un archivo. Pueden ser estáticas o dinámicas. En esta tarea crearás una biblioteca de funciones que calculan distancias entre dos puntos en un plano cartesiano. Agruparemos estas funciones dentro de una biblioteca estática y dentro de una biblioteca dinámica, y crearemos un par de programas, uno que usa la biblioteca estática y el otro que usa la biblioteca dinámica. Actividades
Para compilar debemos de ejecutar make
, eso creará dos archivos principales:
main.os
- main output con librería estáticamain.od
- main output con librería dinámica
Para correr el ejecutable con la librería dinámica tenemos que exportar la ruta de la ubicación de la librería:
export LD_LIBRARY_PATH=~/Documents/PrograAvanzada/Tarea3/bin/dynamic
Una vez hecho esto lo podemos correr normal con ./main.od
Para correr el ejecutable solo ponemos ./main.os
ya que la librería está incluida en la compilación
Solo debemos ejecutar make clean
para limpiar todo el proyecto
Archivo 1:
// Archivo: distancias.h
#ifndef _DISTANCIAS_H
#define _DISTANCIAS_H
float dlr( int, int, int, int );
int dh( int, int, int, int );
int dv( int, int, int, int );
int abs( int );
#endif
Archivo 2:
// Archivo: dlr.c
#include <math.h>
float dlr( int x1, int y1, int x2, int y2 ) {
float r;
r = sqrt( pow( ( x1 - x2 ), 2) + pow( (y1 - y2 ), 2 ) );
return r;
}
Archivo 3:
// Archivo: dh.c
#include "distancias.h"
int dh( int x1, int y1, int x2, int y2 ) {
int r;
r = abs( x1 - x2 );
return r;
}
Archivo 4:
// Archivo: dv.c
#include "distancias.h"
int dv( int x1, int y1, int x2, int y2 ) {
int r;
r = abs( y1 - y2 );
return r;
}
Archivo 5:
// Archivo: abs.c
int abs( int x ) {
if( x < 0 )
return –x;
else
return x;
}
Ahora vamos a generar el código objeto de cada uno de los archivos anteriores. Usa una carpeta para guardar los archivos objeto para las librerías estáticas y otra carpeta para guardar los archivos objeto para las librerías dinámicas (recuerda la opción -fPIC
para cuando queramos usar librerías dinámicas)
- dlr.c
- dh.c
- dv.c
- abs.c
Crea el archivo libdistancias.a
. dentro de la carpeta donde se encuentran los archivos objetos para las librerías estáticas
Nota: Es importante que el nombre de la librería estática inicie con el prefijo lib
y termine con la extensión .a
Crea el archivo libdistancias.so
. dentro de la carpeta donde se encuentran los archivos objetos para las librerías dinámicas
Nota: Es importante que el nombre de la librería dinámica inicie con el prefijo lib
y termine con la extensión .so
Ahora creamos dos programas que usaremos para generar dos ejecutables, uno que use las librerías estáticas y otro que use las librerías dinámicas.
#include <stdio.h>
#include "path donde esta la libreria" // debes poner el path hacia donde se
//encuentran tus librerías…
int main(int argc, char *argv[]) {
float dlrecta;
int dhoriz, dvert;
dlrecta = dlr( 3, 4, 10, 12 );
printf("Distancia en línea recta: %d\n", directa);
dhoriz = dh( 3, 4, 10, 12 );
dvert = dv( 3, 4, 10, 12 );
printf("Distancia horizontal: %d\n", dhoriz);
printf("Distancia vertical: %d\n", dvert);
return 0;
}
Compila tu programa main1.c
utilizando las librerías estáticas
Compila tu programa main2.c
utilizando las librerías dinámicas
Ahora prueba la ejecución de cada uno de estos programas y verifica que funcionen correctamente.
Ahora vamos a agregar funciones a las librerías anteriores. Se trata de las funciones que calculan las coordenadas del punto medio entre dos puntos. Una de ellas será la función int xpm(int x1, int y1, int x2, int y2)
, que regresa la coordenada en x del punto medio entre los puntos (x1,y1)
y (x2,y2)
, y la otra será la función int ypm(int x1, int y1, int x2, int y2)
, que regresa la coordenada en y del punto medio. La siguiente figura ilustra el punto medio y la forma de obtener sus coordenadas.
Incluye aquí el contenido de los archivos xpm.c
y ypm.c
, donde se definen las funciones int xpm(int x1, int y1, int x2, int y2)
e int ypm(int x1, int y1, int x2, int y2)
, respectivamente.
// Archivo xpm.c
// Archivo ypm.c
Para agregar estas funciones, debemos declarar sus prototipos en el archivo distancias.h. Modifica este archivo.
Ahora modifica el archivo main.c para mostrar el uso de esta nueva función.
Compila nuevamente tus librerías estáticas y dinámicas
Compila y muestra la ejecución de los dos programas modificados y comenta brevemente sobre el resultado de su ejecución.