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