"Mi estilo es el arte de luchar, sin luchar"
"An algorithm must be seen to be believed" Donald Knuth

Biblotecas Estaticas y Dinamicas en C

2009-03-24 08:14:46-06                  Esta entrada ha sido vista 34 veces.

Software

Cuando las aplicaciones adquieren un tamaño decente y necesitamos compartir y estandarizar formas de hacer las cosas, es necesario crear bibliotecas.

Esta bibliotecas pueden ser vistas como un conjunto de funciones o subrutinas, que pueden ser incrustadas o llamadas en el codigo de los programas que escribimos. Una buena Biblioteca es además óptima y bien documentada.

Para fines practicos nos interesan 2 tipos de bibliotecas:

  • Bibliotecas Estáticas: Estas bibliotecas son incluidas directamente en el código objeto del ejecutable en tiempo de compilación, Tienen la desventaja de que el ejecutable sea demasiado grande y que si se tienen varios programas que usen esa biblioteca, esa misma biblioteca esta cargada (repetida) varias veces en memoria. sin embargo tiene la ventaja de que el programa ejecutable puede correr sin necesidad de sistema operativo, por ejemplo, cargandolo en memoria usando grub =).
  • Bibliotecas Dinámicas: Son llamadas y enlazadas dinámicamente en tiempo de ejecución, es decir existe solo una copia de la biblioteca en memoria que es usada por todos los programas que la requieran, la desventaja es que requiere de un SO para ser cargada y enlazada.

En C y usando el compilador gcc, todas las bibliotecas (salvo las estandar) deben ser ligadas con la opcion -l si estan en la ruta estándar o -L si hay que especificar el path de la biblioteca. La opción -I es util cuando se desea cambiar la trayectoria de búsqueda de los archivos especificados en #include.

Imaginemos siguiente codigo en C en los archivos libgss.h, gss.c y random.c respectivamente:

-----------------------------------------------libgss.h---------------------------------------------

//archivo libgss.h

extern int gss(void);
extern int random(void);

--------------------------------------------------gss.c----------------------------------------------

/*GetSecureSeed: pequenia funcion que regresa un entero Pseudo-aleatorio para ser usado como inicializador en la funcion srand()
de la biblioteca estandar*/

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define RDNFIL "/dev/random"
#define INTBUF  4

int gss(void){
    int fd,ret;
    fd=open(RDNFIL,O_RDONLY);
    read(fd,&ret,INTBUF);
    close(fd);
return ret;
}
//disculpen la suciedad de este codigo, solo funciona en arquitecturas donde los enteros sean de 4 bytes (32bits) ,
//pero solo es un ejemplo, no sean duros conmigo

---------------------------------------------------random.c------------------------------------------------

/*lo vi una vez en una tira y ocupaba otra funcion para el ejemplo =P*/
int random(void){
return 4;
}

Haciendo Bibliotecas Estaticas.

Para la creacion de bibliotecas estaticas nos auxiliamos de  ar, ranlib y gcc.

Primero: compilacion, esto nos entregara 2 archivos, "gss.o" y "random.o"

gcc -c gss.c random.c

Segundo
: crear biblioteca, una biblioteca con el nombre "libgss.a", la terminacion '.a' es estandar en las bibliotecas estaticas de UNIX(R)

ar r libgss.a gss.o random.o

Tercero: indexando para el cargador

ranlib libgss.a

Haciendo Bibliotecas Dinamicas

Primero: compilar con opciones de facil relocalizacion (PIC:Position Independent Code)

gcc -c -fPIC gss.c random.c

Segundo: Crear la biblioteca compartida, la terminacion ".so" es estandar en los UNIX(R)

gcc -shared -o libgss.so gss.o random.o

Probando y agregando un poco elegancia

Necesitamos un  pequeño programa para probar las bibliotecas, algo tan sencillo como imprimir los numeros que regresan las funciones:

--------------------test.c---------------------------

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

int main(){
    int a,b,c;
    a=gss();
    srand(a);
    b=rand();
    c=random();
    printf("gss:%d\nrand:%d\nrandom:%d\n",a,b,c);
return 0;
}

------------------------------------------------------

Este programa se compilaria de la siguiente manera:

gcc -I./ -L./ -o test test.c -lgss

Con -I indicamos el path de los "headers" y con -L el de las bibliotecas. La opcion -l indica la biblioteca que "Cargara". Usualmente no se escribe completa, salvo que se quiera especificar alguna biblioteca (libgss.a para estatica o libgss.so para dinamica), por defecto cargara la biblioteca dinamica y es un estandar que la bibliotecas empienzen con "lib", entonces este se omite.

Ahora, agregando un poco de elegancia, crearemos un par de directorios, uno lib y el otro include. moveremos las bibliotecas a lib y el hader a include. Esto deberia hacerse siempre

mkdir lib include
mv libgss.[!cho]? lib/
mv libgss.h include/
gcc -I./include -L./lib -o test test.c -lgss


¿Deseas saber mas?

  • man ar
  • man ranlib
  • man gcc

 

Permalink: http://www.mononeurona.org/entries/view/vendaval/1769


Comments Commentblogs:
New Commentblog
CAPTCHA Image




Join us!
Forgot your password?
This blog has been visited
30,942 times
vendaval
Alberto Rodriguez Sanchez Estudiante de Ingenieria en Computación en la UAM-A, programo en C, C++, C#, Python, Scheme, PHP,y Haskell. Uso Archlinux, Debian GNU/Linux, Mac OS X, OpenSolaris, NetBSD, FreeBSD, Plan9 y Win2. Pienso especializarme en computo científico y criptografía, que son mis grandes pasiones.

También pienso que la programación computacional es un Arte y que muchos programas son elegantes, muchos exquisitos, muchos son brillantes. Mi pensar es que se pueden escribir grandes programas, programas nobles y programas verdaderamente magníficos,por ello prefiero la Sintaxis Avanzada en los programas por que muestra un dominio del lenguaje y un buen grado de abstracción.

FreeBSD, C, Enlightenment y VI(M); son mis SO, Lenguaje de programación, manejador de ventanas y editor favoritos.

Practico Kali Filipino, Limalama y JKD (soy seguidor de la filosofía de Bruce Lee). Ademas soy el guardian la Sexta Casa del Zodiaco y también escribo con cierta regularidad en este blog.

"Se como el agua, piensa como el fuego"
Powered by
Despabilando la MonoNeurona.org
Livechat
<-Nombre

reiken wrote:
http://tinyurl.com/782vp5u
2 days, 8 hours ago

vendaval wrote:
Daniel Dahink wrote: Es poesía tu artículo de "Anatomía de un Hola Mundo" gracias por compartir, amigo
on 27/6/11

wrote:

on 26/6/11

wrote:
eres un PENDEJO
on 8/4/11

ethel wrote:
hola muchas garcías por toda la ayuda espero tengas un lindo fin
on 12/3/11

vendaval wrote:
sudo wireshark en la terminal
on 6/3/11

tony wrote:
una pregunta? despues de installar wireshark con con su -c"yum install wireshark" y k se complete la instalacion k ago para abrirl
on 5/3/11

vendaval wrote:
su -c "apt-get install amsn"
on 3/3/11

ethel wrote:
hola podrías decirme como instalar el amsn en debian ya lo intente y no lo logro de hecho ningún otro programa gracias
on 3/3/11

ethel wrote:
hola esta padre tu blog, me gusta mucho tu forma de explicar y lomas agradable es que seas pasiente, sigue asi :)
on 3/3/11


Llevo todo el día nostálgico, sera que el cielo gris me pone el corazón sentimental.
4 days, 8 hours ago
Haciendo imágenes .eps para un "paper"
1 week, 4 days ago
chingon, pero ya duermete aarkerio, todo lo andas testeando.
on 20/12/11
tengo que volver a arreglar mi i3.conf es lo malo de estar al día con las actualizaciones, dios nos libre de que sea administrador
on 16/12/11
que hacen los mononeurones tan tarde por aca???
on 30/11/11
Recupérate pronto @aarkerio
on 23/11/11
@chilicuil: thx.
on 3/11/11
Tristeando y sin sueño
on 2/11/11
@rnstux: muchos estamos así, pero date tiempo.
on 25/10/11
o de beber
on 17/10/11
Mis Albums
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2011.