Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

librerias en C (I)

Vamos a crear una libreria paso a paso
Ejercicio: hacer librería sumar-resar
1º Crear estos tres directorios en /home/usuario/ para organizar nuestras librerias propias.:
mkdir bin
mkdir lib
mkdir include

2º paso:
nano -w ..bashrc
Editor de texto, -w (para que no te haga saltos de escritoras automaticos, y haga scroll, para verla completa), y editamo s el archivo “.bashrc”
Y nos vamos al final del archivo, y escribimos:
LD_LIBRARY_PATH="$HOME/LIB:.:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH

A la variable LD_LIBRARY_PATH le asigna 3 valores (separados por dos puntos “:”):
/HOME/LIB (directorio /HOME/usuario/LIB)
. (el directorio donde se encuentre)
LD_LIBRARY_PATH
export: la estamos dejando accesible a cualquier programa. (la convertimos en variable de entorno)

Salvamos nano: ctrl-X,S,ENTER

Y cerramos nuestra seccion y volvemos a entrar.

3º Abrimos otra terminal, donde vamos a introducir nuestros programas (nuestros códigos fuentes)
mkdir src

4º Cremos una nueva carpeta para nuestra liberia.
Mkdir src/ej_lib_0

5º Nos vamos al geany.
Y le damos al menu Archivo/Nuevo/
Nos vamos a Archivo/Guardar Como, selecciono el directorio src/ej_lib_0, y le llamomos “mini.h”

Volvemos al menu Archivo/Nuevo
Nos vamos a Archivo/Guardar Como, selecciono el directorio src/ej_lib_0, y le llamomos “mini.c”
Ya tenemos lo básico para empezar nuestra libreria.
Ahora escribiremos en los archivos lo siguiente:

Ahora pasamos a compilarlar la libreria
Me tengo que ir a directorio donde esta el ej_lib_0

Ahora vamos a crearla como librería estatica:
$gcc -Wall -I. -c -o mini.o mini.c
nota:
-I. el punto es para indicarle que esta .h en el directorio actual
-c: para que solo compile
-o: genera el archivo que va a resultar
mini.o: nombre que crea
mini.c: el que voy a compilar

Ahora vamos a generar la librería:
$ar -rv libmini.a mini.o

y nos sale esa información por pantalla:
ar: creating libmini.a
a – mini.o


Ahora la vamos a crear como librería dinámica:
Compilamos
$gcc -Wall -I. -c -o mini.o mini.c

Generamos
ld -o libmini.so mini.o -shared
-shared “que sea compartida”

Esquema resumen

Ahora vamos a crear un programa “pru.c” donde usemos estas librerias.

#include <stdio.h>
#include "mini.h"

int main(int argc, char **argv)
{
int n1=8;
int n2=5;
int resultado=0;
resultado=suma(1,n1);
printf("%d\n",resultado);
resultado=resta(8,n2);
printf("%d\n",resultado);
resultado=suma(n1,n2);
printf("%d\n",resultado);
return 0;
}


Ahora tenemos que si le decimos a geany que compile nos da error, lo tenemos que hacer con la terminal:


gcc -Wall -I. -L. -o pru_esta pru.c -static -lmini

nota: nuestra librería en mini, aunque el nombre del fichero sea libmini.a

Y el programa ejecutable sera: pru_esta
Ahora vamos a compilar el programa usando la librería dinámica:
gcc -Wall -I. -L. -o pru_esta pru.c -lmini
Notas: Comparaciones entre librerias dinamica – estatica.

- Si tenemos un error en la librería, el programa pru_esta, deberia de ser compilado completamente (al usar librería estatica).

Pero si usa el programa la librería dinamica, se soluciona copiando la nueva librería dinamica en donde lo hubieses puesto /usr/lib.

-Si modificamos una librería, si el programa es estatico, no hay problemas. Pero si es dinamico, falla.
  • Por ejemplo:
Si la funcion suma, la hago que suma 3 numeros pero con el mismo nombre, el programa que usa esa librería dinamica, habria que cambiarlo o fallaria, ya que el se hizo con suma 2 numeros.


Ejercicio: hacer que la librería tenga la funcion de multiplicar y dividir:
//archivo mini.h
# ifndef _MINI_H //vale para que solo se ejecute una vez.
# define _MINI_H

int suma(int n1,int n2);
int resta(int n1,int n2);
int multiplica(int n1,int n2);
float divide(float n1,float n2);
# endif // cierro el ifndef



//archivo mini.c
#include <stdio.h>
#include "mini.h"

// entre comillas para que lo busque en el mismo directorio
// que esta en mini.c

int suma(int n1,int n2) {
int result=0;
result=n1+n2; // sumamos
return result;
}

int resta(int n1,int n2) {
int result=0;
result=n1-n2; // restamos
return result;
}

int multiplica(int n1,int n2) {
int result=0;
result=n1*n2; // multiplicamos
return result;
}

float divide(float n1,float n2) {
float result=0.0;
if (n2!=0.0){
result=n1/n2; // dividimos

} else {
printf("Error dividiendo entre cero.../");
result=0.0;
}

return result;
}



//archivo pru.c
#include <stdio.h>
#include "mini.h"

int main(int argc, char **argv)
{
int n1=8.0;
int n2=5.0;
float resultado=0.0;
resultado=suma(1,n1);
printf("%f\n",resultado);
resultado=resta(8,n2);
printf("%f\n",resultado);
resultado=suma(n1,n2);
printf("%f\n",resultado);
resultado=multiplica(n1,n2);
printf("%f\n",resultado);
resultado=divide(n1,n2);
printf("%f\n",resultado);
return 0;
}



No hay comentarios:

Publicar un comentario