Biblioteca

20
Biblioteca Bibliografía: Http://www.geocities.com/chuidiang/ herramientas/librerias.html

description

Biblioteca. Bibliografía: Http://www.geocities.com/chuidiang/herramientas/librerias.html. Bibliotecas. Cuando hacemos cualquier programa en: #include #include int main(){ printf("kaixo"); exit(0); }. Bibliotecas. Se usan librerías C: - PowerPoint PPT Presentation

Transcript of Biblioteca

Page 1: Biblioteca

Biblioteca

Bibliografía: Http://www.geocities.com/chuidiang/herramientas/

librerias.html

Page 2: Biblioteca

Bibliotecas

Cuando hacemos cualquier programa en:

#include <stdio.h>

#include <stdlib.h>

int main(){

printf("kaixo");

exit(0);

}

Page 3: Biblioteca

Bibliotecas

Se usan librerías 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

Page 4: Biblioteca

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: mayúsc.=malo)

||/ Nombre Versión Descripción

+++-=========================-=========================-==================================================================

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

Page 5: Biblioteca

Bibliotecas

El paquete libc contiene las bibliotecas estándar usadas por muchos de los programas del sistema. Este paquete contiene las bibliotecas compartidas más importantes: la biblioteca estándar C y la biblioteca estándar matemática. Sin estas dos bibliotecas el sistema Linux no funcionará.

Page 6: Biblioteca

Bibliotecas

Instala libc6-dev si va a desarrollar programas usando las bibliotecas estándares 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

Page 7: Biblioteca

Bibliotecas

El paquete libc6-dev contiene:

dpkg -L libc6-dev

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

Page 8: Biblioteca

Bibliotecas

Los programas escritos en C usan: bibliotecas y ficheros cabecera .h

Archivos cabecera de las Librerías 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 están: /usr/include.

Page 9: Biblioteca

Biblioteca Archivos de biblioteca:

Estáticas: El código de la biblioteca se integra en el ejecutable

Dinámicas: El código de biblioteca se carga durante la ejecución.

Page 10: Biblioteca

Bibliotecas

Ventajas de las dinámicas frente a las estáticas: Ejecutables ocupan menos. Sólo se carga una vez, aunque se le llame de varios

programas. Ocupa menos memoria. No hace falta recompilar la aplicación al modificar la

biblioteca.

Page 11: Biblioteca

Organizar bibliotecas

Uno o más ficheros fuente .c con el código de nuestras funciones.

Uno o más ficheros de cabecera .h con los tipos (typedefs, structs ...) y prototipos de las funciones que queramos que se puedan utilizar.

Las librerías están 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

Page 12: Biblioteca

Organizar bibliotecas

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

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

Page 13: Biblioteca

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 definirán 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 inclusión anterior), por lo que no se entrará en el bloque #ifndef - #endif, y no se redefinirá nada por segunda vez.

Page 14: Biblioteca

Biblioteca Estática

1.-Creo el código 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 sólo ficheros objeto). Tiene además opciones para ver qué ficheros hay dentro, borrar algunos de ellos, reemplazarlos, etc.

ar rv libgeneral.a libreria1.o donde opción -r inserta o reemplaza los ficheros objeto en la librería. La opción -v es "verbose". A continuación todos los ficheros objeto a insertar.

Page 15: Biblioteca

Biblioteca Estática

3.-ranlib genera un índice de los contenidos de un archivo, y lo coloca al comienzo del archivo, y que contiene una descripción de los módulos y los identificadores que va a poder resolver el linker sin necesidad de leerse toda la biblioteca.

ranlib libgeneral.a

Page 16: Biblioteca

Biblioteca estática

4.-Para visualizar el índice:

nm -s libgeneral.a

5.-Generar el ejecutable, que usa una función 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

Page 17: Biblioteca

Biblioteca Estática

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 están en otra carpeta distinta a “/usr/include”; -L<path> cuando los .a o .so están en otra carpeta distinta a “/lib o /usr/lib” y -llibreria indica el nombre de la librería sin el prefijo lib ni la extensión .a (ya que las pone automáticamente el compilador)

Page 18: Biblioteca

Biblioteca dinámicas

1.-Creo el código objeto de libreria1.c

gcc -c libreria1.c -o libreria1.o

2.-El lincador crea la librería con el comando:

ld -o libgeneral.so libreria1.o -shared

La opción -o libgeneral.so le indica el nombre que queremos dar a la librería.

La opción -shared le indica que debe hacer una librería y no un ejecutable(por defecto).

Page 19: Biblioteca

Biblioteca dinámica

3.-Una vez generada la librería, 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 opción -Bdynamic hace que coja libgeneral.so en vez de libgeneral.a

Page 20: Biblioteca

Biblioteca Dinámicas

4.-Una vez compilado el ejecutable, nos falta un último paso. Hay que decirle al programa, mientras se está ejecutando, dónde están las librerías dinámicas, puesto que las va a ir a buscar cada vez que se llame a una función de ellas. Tenemos que definir la variable de entorno LD_LIBRARY_PATH, en la que ponemos todos los directorios donde haya librerías dinámicas de interés.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