Post on 05-Jul-2020
transcript
Dpto. de Cs. e Ing. de la Computación.Universidad Nacional del Sur.
[Organización de Computadoras]
LIBRERÍAS DINÁMICAS EN C.
Organización de Computadoras – 2º cuatrimestre 2019
Copyright
o Copyright © 2019 Ing. Federico Joaquín (federico.joaquin@cs.uns.edu.ar)
o El uso total o parcial de este material está permitido siempre que se hagamención explícita de su fuente: “Notas de Clase. Organización deComputadoras.” Federico Joaquín. Universidad Nacional del Sur. (c) 2019.
o Las presentes transparencias constituyen una guía acotada y simplificada de latemática abordada, y deben utilizarse únicamente como material adicional o deapoyo a la bibliografía indicada en el programa de la materia.
2jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías en C.
3jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías :: ¿Qué son?o Las librerías son una forma sencilla y versátil de modularizar y reutilizar código.
o Una librería es en esencia, un conjunto de funciones y/o procedimientos.
o Las librerías permiten encapsular funcionalidad, que luego puede estar disponible en diferentes programas.
o Para que esta funcionalidad encapsulada pueda ser utilizada, el programa que la requiera debe encargarse de enlazar la librería que la contiene.
o Las librerías pueden clasificarse en dos grandes familias:
• Librerías estáticas
• Librerías dinámicas
4jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías estáticaso Son librerías que se enlazan al compilar un programa.
o De esta forma, la librería queda junto con el código fuente compilado del programa, en un único ejecutable.
o Ventajas de una librería estática:
• Sólo se copia la funcionalidad a utilizar por el programa (si la librería posee 10 funciones, pero el programa sólo usa 2, son sólo esas 2 las que se copian).
• Permiten una ejecución más rápida, ya que el código ejecutable de la funcionalidad se encuentra junto con el ejecutable del programa.
5jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías estáticaso Son librerías que se enlazan al compilar un programa.
o De esta forma, la librería queda junto con el código fuente compilado del programa, en un único ejecutable.
o Desventajas de una librería estática:
• El código ejecutable final es más grande, debido a que se copia la funcionalidad.
• Un cambio en los fuentes de una librería estática, obliga a recompilar los programas que hacen uso de la funcionalidad provista por esta.
6jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías estáticaso Son librerías que se enlazan al compilar un programa.
o De esta forma, la librería queda junto con el código fuente compilado del programa, en un único ejecutable.
o Dependiendo el sistema operativo, pueden encontrarse con la extensión :
• .lib en Windows.
• .a en Linux.
7jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías dinámicaso Son librerías que se enlazan al ejecutar un programa.
o La librería no queda junto con el código fuente compilado del programa, sino que su funcionalidad se encuentra compilada en un archivo aparte.
o Ventajas de una librería dinámica:
• El código ejecutable final de un programa que hace uso de una librería dinámica es más pequeño, debido a que no se copia la funcionalidad de la librería en este.
• Los cambios que se realicen por sobre una librería dinámica, no obligan a recompilar cada uno de los programas que la utilizan.
8jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías dinámicaso Son librerías que se enlazan al ejecutar un programa.
o La librería no queda junto con el código fuente compilado del programa, sino que su funcionalidad se encuentra compilada en un archivo aparte.
o Desventajas de una librería dinámica:
• Pueden proveer una ejecución más lenta, ya que el código ejecutable de la funcionalidad se encuentra en un archivo por fuera del ejecutable del programa que la utiliza.
• Los programas deben necesariamente ser movidos junto con todas las librerías dinámicas que utilice.
9jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías dinámicaso Son librerías que se enlazan al ejecutar un programa.
o La librería no queda junto con el código fuente compilado del programa, sino que su funcionalidad se encuentra compilada en un archivo aparte.
o Dependiendo el sistema operativo, pueden encontrarse con la extensión :
• .dll en Windows.
• .so en Linux.
10jueves, 19 de septiembre de 2019
Organización de Computadoras – 2º cuatrimestre 2019
Librerías dinámicas ::un ejemplo
11jueves, 19 de septiembre de 2019
Librerías dinámicas :: Ejemplo
jueves, 19 de septiembre de 2019 12
#ifndef CALCULADORA_H_INCLUDED#define CALCULADORA_H_INCLUDED
extern void suma(int op1, int op2, int * res);extern void resta(int op1, int op2, int * res);extern void multiplicacion(int op1, int op2, int * res);extern void division(int op1, int op2, int * res);
#endif // CALCULADORA_H_INCLUDED
Considerar el caso de una librería que implementa una calculadora
#include <stdlib.h>#include "calculadora.h"
void suma(int op1, int op2, int * res){*res = op1 + op2;
}void resta(int op1, int op2, int * res){*res = op1 - op2;
}
void multiplicacion(int op1, int op2, int * res){*res = op1 * op2;
}
void division(int op1, int op2, int * res){if (op2 == 0) exit(EXIT_FAILURE);*res = op1 / op2;
}
Librerías dinámicas :: Ejemplo
jueves, 19 de septiembre de 2019 13
#include <stdlib.h>#include <stdio.h>#include "calculadora.h"
int main(){int op1, op2;int resultado;
printf("Ingrese operandos 1 y 2: ");scanf("%i %i", &op1, &op2);
suma(op1,op2, &resultado);printf("Suma igual a: %i \n", resultado);
resta(op1,op2, &resultado);printf("Resta igual a: %i \n", resultado);
multiplicacion(op1,op2, &resultado);printf("Multiplicacion igual a: %i \n", resultado);
division(op1,op2, &resultado);printf("Division igual a: %i \n", resultado);
return 0;}
Considerar el caso de un programa que utiliza esta calculadora
Librerías dinámicas :: Ejemplo
jueves, 19 de septiembre de 2019 14
Compilando librería en MinGW (Windows)
Se compila la librería:
• gcc –Wall -c calculadora.c
Se genera la DLL:
• gcc –Wall -o calculadora.dll calculadora.o -shared
Se compila el programa principal:
• gcc –Wall -c programa.c
Se genera el ejecutable, enlazando la DLL:
• gcc –Wall -o programa.exe programa.o calculadora.dll
Librerías dinámicas :: Ejemplo
jueves, 19 de septiembre de 2019 15
Compilando librería en GCC (Linux)
Se compila la librería:
• gcc –Wall -c calculadora.c
Se genera el SO:
• ld –Wall -o libcalculadora.so calculadora.o –shared
• Por defecto, las librerías dinámicas se notan con el prefijo lib seguido del nombre.
Se compila el programa principal:
• gcc –Wall -c programa.c
Se genera el ejecutable, enlazando el SO:
• gcc –Wall -o programa programa.o –LPath –lName
• -Path es la ruta hacia la carpeta donde está la librería.
• Name es el nombre de la librería sin el prefijo lib y sin la extensión .so
Librerías dinámicas :: Ejemplo
jueves, 19 de septiembre de 2019 16
Compilando librería en GCC (Linux)
Si se intenta ejecutar el programa, se indicará el siguiente error
• ./programa
• ./programa: error while loading shared libraries:libcalculadora.so: cannot open shared object file: Nosuch file or directory
El problema surge al intentar ejecutar el programa, ya que este busca en una ubicación estándar ( usr/lib ) la librería enlazada. Dicho esto, es necesario mover la librería hacia esta ubicación. Con permisos de root, se debe:
• $ cp /path/to/lib/libcalculadora.so /usr/lib
• $ chmod 0755 /usr/lib/libcalculadora.so
• $ ldconfig