"Mi estilo es el arte de luchar, sin luchar"
"Controlling complexity is the essence of computer programming" Brian Wilson Kernighan

Biblotecas Estaticas y Dinamicas en C

2009-03-24 08:14:46-06

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://mononeurona.org/entries/view/vendaval/1769


Comments Comentblogs:
New Comentblog
Captcha Image
Login




Join us!
Forgot your password?
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

wrote:

on 17/1/10

wrote:
que parsante
on 17/1/10

Puro Hueso wrote:
chistosito
on 8/10/09

vendaval wrote:
ok, =)
on 5/10/09

Puro Hueso wrote:
salgo a las 2, no creo que te quede (mejor quedate a ver viejas)
on 5/10/09

vendaval wrote:
Soul-Tlamaqui -> http://callix.azc.uam.mx/soul
on 1/10/09

rik wrote:
:P soul-tralmakui tiene página? :P
on 1/10/09

vendaval wrote:
207202346 recuerda
on 26/9/09

puro hueso wrote:
me urge que me llames
on 21/8/09

eVa wrote:
Hola mi querido Betux :) ya no lo he visto en línea, ya conectese no? Un beso!
on 20/8/09


@aarkerio: no puedo cambiar mi css. =(
41 minutes ago
y que onda, ya llego la lap o no?
10 hours, 48 minutes ago
LOL
1 week ago
Seguro usas gnome, yo por eso fluxbox...donde todas las pendejadas que suceden son por mi culpa
1 week, 2 days ago
Entonces estas estrenando lap aarkerio??
1 week, 5 days ago
Pues hay que poner tema y fecha.
2 weeks, 1 day ago
Campus Party ...Igual el próximo Año. =(
3 weeks ago
@asarch: malo para el hígado.
3 weeks, 1 day ago
Peleando con un X-gdb
3 weeks, 1 day ago
Creo que algo cambio: http://www.scribd.co m/doc/35539144/pnp12 pt
3 weeks, 3 days ago
Mis Albums
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2010.