Está en la página 1de 20

Biblioteca

Bibliografa:

Http://www.geocities.com/chuidiang/herramientas/libreri as.html

Bibliotecas

Cuando hacemos cualquier programa en:

#include <stdio.h> #include <stdlib.h> int main(){ printf("kaixo"); exit(0); }

Bibliotecas

Se usan libreras C:

gcc miprimer.c -o miprimer.exe ldd miprimer.exe linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7db5000) /lib/ld-linux.so.2 (0xb7f05000)

Buscamos a que paquete pertenece: dpkg -S /lib/libc.so.6

libc6: /lib/libc.so.6

Bibliotecas

Buscamos info del paquete:

$ dpkg -l libc6
Desired=Unknown/Install/Remove/Purge/Hold | Estado=No/Instalado/Config-files/Unpacked/Failed-config/Half-installed |/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: maysc.=malo) ||/ Nombre Versin Descripcin

+++-=========================-=========================================================================================== ii libc6 2.5-0ubuntu14 GNU C Library: Shared libraries

Bibliotecas

El paquete libc contiene las bibliotecas estndar usadas por muchos de los programas del sistema. Este paquete contiene las bibliotecas compartidas ms importantes: la biblioteca estndar C y la biblioteca estndar matemtica. Sin estas dos bibliotecas el sistema Linux no funcionar.

Bibliotecas

Instala libc6-dev si va a desarrollar programas usando las bibliotecas estndares de C. $sudo aptitude install libc6-dev El paquete libc6-dev contiene:GNU C Library: Development Libraries and Header Files $sudo aptitude show libc6-dev

Bibliotecas

El paquete libc6-dev contiene:

dpkg -L libc6-dev

En los archivos objeto necesarios para el desarrollo de programas que usen las bibliotecas estndares de C (que se usan casi en todos los programas). Si est desarrollando programas que usarn las bibliotecas estndares de C, su sistema necesitar tener estos archivos objeto estndares disponibles para poder crear los ejecutables.Adems de los ficheros cabecera de C que se instalarn en /usr/include. (Ejm:/usr/include/stdio.h...)

Bibliotecas

Los programas escritos en C usan: bibliotecas y ficheros cabecera .h Archivos cabecera de las Libreras de C:

Contienen declaraciones, prototipos o cabeceras de las funciones incluidas en las bibliotecas (/usr/lib/libc.a y libc.so) Contienen macros y definiciones de tipos que se usan en dichas funciones.

El prepocesador se encarga de procesar las directivas: #include, #define, ...


Las cabeceras estn: /usr/include.

Biblioteca

Archivos de biblioteca:

Estticas: El cdigo de la biblioteca se integra en el ejecutable Dinmicas: El cdigo de biblioteca se carga durante la ejecucin.

Bibliotecas

Ventajas de las dinmicas frente a las estticas:


Ejecutables ocupan menos.


Slo se carga una vez, aunque se le llame de varios programas. Ocupa menos memoria. No hace falta recompilar la aplicacin al modificar la biblioteca.

Organizar bibliotecas

Uno o ms ficheros fuente .c con el cdigo de nuestras funciones. Uno o ms ficheros de cabecera .h con los tipos (typedefs, structs ...) y prototipos de las funciones que queramos que se puedan utilizar. Las libreras estn en: /lib y /usr/lib, ref:http://www.pathname.com/fhs/pub/fhs-2.3.html Ejm: $gcc pi.c -o pi.exe $ldd -v pi.exe ./pi.exe: libc.so.6 (GLIBC_2.0) => /lib/libc.so.6

Organizar bibliotecas
En libreria1.c: int suma (int a, int b) { return a+b; } int resta (int a, int b) { return a-b; }

En libreria1.h: #ifndef _LIBRERIA_1_H #define _LIBRERIA_1_H int suma (int a, int b); int resta (int a, int b); #endif

Organizar bibliotecas
Conflicto: En fichero1.h existe #include <libreria1.h> En fichero2.h existe #include <libreria1.h> En fichero3.c existe #include <fichero1.h> y #include <fichero2.h> Para evitar: Cuando incluyamos este fichero por primera vez, _LIBRERIA_1_H no estar definido, as que se entrar dentro del bloque #ifndef - #endif y se definirn todos los tipos y prototipos de funciones, incluido el mismo _LIBRERIA_1_H. Cuando lo incluyamos por segunda vez, _LIBRERIA_1_H ya estar definido (de la inclusin anterior), por lo que no se entrar en el bloque #ifndef #endif, y no se redefinir nada por segunda vez.

Biblioteca Esttica
1.-Creo el cdigo objeto de libreria1.c
gcc -c libreria1.c -o libreria1.o

2.-ar crea una biblioteca, aunque en realidad sirve para empaquetar cualquier tipo de fichero (no slo ficheros objeto). Tiene adems opciones para ver qu ficheros hay dentro, borrar algunos de ellos, reemplazarlos, etc.
ar rv libgeneral.a libreria1.o donde opcin -r inserta o
reemplaza los ficheros objeto en la librera. La opcin -v es "verbose". A continuacin todos los ficheros objeto a insertar.

Biblioteca Esttica
3.-ranlib genera un ndice de los contenidos de un archivo, y lo coloca al comienzo del archivo, y que contiene una descripcin de los mdulos y los identificadores que va a poder resolver el linker sin necesidad de leerse toda la biblioteca.
ranlib libgeneral.a

Biblioteca esttica
4.-Para visualizar el ndice: nm -s libgeneral.a 5.-Generar el ejecutable, que usa una funcin de la biblioteca:
aplicacion.c es: #include <stdio.h> -->/usr/include/ #include "libreria1.h" -->dir. actual int main(void){printf("%d",suma(8,9));return 0;} gcc -o aplicacion.exe aplicacion.c libgeneral.a

./aplicacion.exe

Biblioteca Esttica
gcc -o miprograma miprograma.c -I<path1> -I<path2> ... -L<path1> -L<path2> ... -lgeneral1 -lgeneral2 Ejm: gcc -L . -I . -o aplicacion.exe aplicacion.c -lgeneral Ejm: gcc -L /home/kepa/lana -I /home/kepa/lana -o aplicacion.exe aplicacion.c -lgeneral

donde -I <path> cuando los .h estn en otra carpeta distinta a /usr/include; -L<path> cuando los .a o .so estn en otra carpeta distinta a /lib o /usr/lib y -llibreria indica el nombre de la librera sin el prefijo lib ni la extensin .a (ya que las pone automticamente el compilador)

Biblioteca dinmicas
1.-Creo el cdigo objeto de libreria1.c
gcc -c libreria1.c -o libreria1.o

2.-El lincador crea la librera con el comando:


ld -o libgeneral.so libreria1.o -shared

La opcin -o libgeneral.so le indica el nombre que queremos dar a la librera.


La opcin -shared le indica que debe hacer una librera y no un ejecutable(por defecto).

Biblioteca dinmica
3.-Una vez generada la librera, para enlazar con ella nuestro programa, hay que poner:
gcc -o aplicacion.exe aplicacion.c -I<path1> -I<path2> ... L<path1> -L<path2> ... -Bdynamic libreria1 libreria2 Ejm:gcc -o aplicacion.exe aplicacion.c -I . -L . -Bdynamic libgeneral.so donde la opcin -Bdynamic hace que coja libgeneral.so en vez de libgeneral.a

Biblioteca Dinmicas
4.-Una vez compilado el ejecutable, nos falta un ltimo paso. Hay que decirle al programa, mientras se est ejecutando, dnde estn las libreras dinmicas, puesto que las va a ir a buscar cada vez que se llame a una funcin de ellas. Tenemos que definir la variable de entorno LD_LIBRARY_PATH, en la que ponemos todos los directorios donde haya libreras dinmicas de inters.Ejm: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kepa/bin y luego escribo: export LD_LIBRARY_PATH 5.-Ahora si podemos ejecutar con : ./aplicacion.exe