Bibliotecas estáticas y dinámicas | Serie 1

Cuando se compila un programa en C, el compilador genera código objeto. Después de generar el código objeto, el compilador también invoca al enlazador. Una de las tareas principales del enlazador es hacer que el código de las funciones de la biblioteca (por ejemplo, printf(), scanf(), sqrt(), ..etc) esté disponible para su programa. Un enlazador puede realizar esta tarea de dos maneras, copiando el código de la función de la biblioteca en su código objeto, o haciendo algunos arreglos para que el código completo de las funciones de la biblioteca no se copie, sino que esté disponible en tiempo de ejecución.

La vinculación estática y las bibliotecas estáticas son el resultado de que el vinculador haga una copia de todas las funciones de biblioteca utilizadas en el archivo ejecutable. La vinculación estática crea archivos binarios más grandes y necesita más espacio en el disco y en la memoria principal. Ejemplos de bibliotecas estáticas (bibliotecas que están vinculadas estáticamente) son archivos .a en Linux y archivos .lib en Windows.

Pasos para crear una biblioteca estática Vamos a crear y usar una biblioteca estática en UNIX o UNIX como OS.
1. Cree un archivo C que contenga funciones en su biblioteca.

/* Filename: lib_mylib.c */
#include <stdio.h>
void fun(void)
{
  printf("fun() called from a static library");
}

Hemos creado un solo archivo por simplicidad. También podemos crear varios archivos en una biblioteca.

2. Cree un archivo de encabezado para la biblioteca

/* Filename: lib_mylib.h */
void fun(void);

3. Compilar archivos de biblioteca.

 gcc -c lib_mylib.c -o lib_mylib.o 

4. Crear biblioteca estática. Este paso consiste en agrupar varios archivos de objetos en una biblioteca estática (ver ar para más detalles). El resultado de este paso es una biblioteca estática.

 ar rcs lib_mylib.a lib_mylib.o 

5. Ahora nuestra biblioteca estática está lista para usar. En este punto, podríamos simplemente copiar lib_mylib.a en otro lugar para usarlo. Para fines de demostración, mantengamos la biblioteca en el directorio actual.

Vamos a crear un programa controlador que utilice la biblioteca estática creada anteriormente .
1. Crea un archivo C con función principal

/* filename: driver.c  */
#include "lib_mylib.h"
void main() 
{
  fun();
}

2. Compile el programa del controlador.

gcc -c driver.c -o driver.o

3. Vincule el programa controlador compilado a la biblioteca estática. Tenga en cuenta que -L . se usa para indicar que la biblioteca estática está en la carpeta actual (consulte esto para obtener detalles sobre las opciones -L y -l).

gcc -o driver driver.o -L. -l_mylib

4. Ejecute el programa del controlador

./driver 
fun() called from a static library

Los siguientes son algunos puntos importantes sobre las bibliotecas estáticas.
1. Para una biblioteca estática, el enlazador extrae el código real de la biblioteca y lo usa para construir el ejecutable final en el punto en que compila/construye su aplicación.

2. Cada proceso obtiene su propia copia del código y los datos. Mientras que en el caso de las bibliotecas dinámicas solo se comparte el código, los datos son específicos para cada proceso. Para las bibliotecas estáticas, las huellas de memoria son más grandes. Por ejemplo, si todas las herramientas del sistema de ventanas estuvieran vinculadas estáticamente, se desperdiciarían varias decenas de megabytes de RAM para un usuario típico, y el usuario se ralentizaría debido a una gran cantidad de paginación.

3. Dado que el código de la biblioteca está conectado en tiempo de compilación, el ejecutable final no tiene dependencias de la biblioteca en tiempo de ejecución, es decir, no hay costos adicionales de carga en tiempo de ejecución, lo que significa que no necesita llevar consigo una copia de la biblioteca que está siendo utilizado y tienes todo bajo tu control y no hay dependencia.

4. En las bibliotecas estáticas, una vez que todo está incluido en su aplicación, no tiene que preocuparse de que el cliente tenga la biblioteca (y la versión) correcta disponible en su sistema.

5. Un inconveniente de las bibliotecas estáticas es que, para cualquier cambio (actualización) en las bibliotecas estáticas, debe volver a compilar el programa principal cada vez.

6. Una de las principales ventajas de que se prefieran las bibliotecas estáticas incluso ahora «es la velocidad». No habrá consultas dinámicas de símbolos en bibliotecas estáticas. Muchos software de línea de producción utilizan bibliotecas estáticas incluso hoy en día.

Vinculación dinámica y bibliotecas dinámicas La vinculación dinámica no requiere que se copie el código, se realiza simplemente colocando el nombre de la biblioteca en el archivo binario. La vinculación real ocurre cuando se ejecuta el programa, cuando tanto el archivo binario como la biblioteca están en la memoria. Ejemplos de bibliotecas dinámicas (bibliotecas que están vinculadas en tiempo de ejecución) son .so en Linux y .dll en Windows.

Pronto cubriremos más puntos sobre las bibliotecas dinámicas y los pasos para crearlas.

Este artículo fue compilado por Abhijit Saha y revisado por el equipo de GeeksforGeeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *