Bibliotecas estáticas

Las bibliotecas estáticas nos permiten reutilizar código entre proyectos fabricando un archivo que empaqueta distintos módulos de código objeto. El propósito de este capítulo es enseñaros cómo se pueden fabricar bibliotecas estáticas con GCC y AR, y cómo luego podemos incluir un archivo .a en GCC para compilar programas que usen bibliotecas estáticas.

Cuando programamos en C, es fundamental entender qué es una biblioteca y cómo nos ayuda a organizar y reutilizar código. Una biblioteca no es más que un conjunto de funciones agrupadas que podemos incorporar en nuestros proyectos para no tener que escribir todo desde cero. A diferencia de una aplicación completa, una biblioteca no tiene una función principal main que se ejecute por sí sola, sino que ofrece funcionalidades que otros programas pueden utilizar.

Las bibliotecas facilitan la distribución y reutilización del código. Por ejemplo, cuando usamos la biblioteca estándar de C, no nos preocupamos por cómo se imprimen caracteres en pantalla o cómo se manejan las ventanas gráficas; simplemente usamos las funciones que ya están implementadas y probadas. Esto nos permite centrarnos en la lógica específica de nuestra aplicación sin reinventar la rueda.

Existen dos tipos principales de bibliotecas: estáticas y dinámicas. Nos enfocaremos primero en las bibliotecas estáticas, que son más sencillas. Una biblioteca estática es un archivo que contiene código objeto empaquetado, similar a un archivo comprimido, que el compilador puede incluir directamente en nuestro programa durante la compilación. Esto significa que el código de la biblioteca se copia literalmente dentro del ejecutable final.

Para crear una biblioteca estática en C con GCC, primero compilamos cada archivo fuente .c en código objeto .o usando la opción -c de GCC. Por ejemplo, si tenemos archivos como sumar.c, restar.c, multiplicar.c y dividir.c, los compilamos así:

gcc -c sumar.c
gcc -c restar.c
gcc -c multiplicar.c
gcc -c dividir.c

Luego, utilizamos la herramienta ar para empaquetar estos archivos .o en un solo archivo de biblioteca estática con extensión .a. La herramienta ar funciona como un archivador, similar a tar, y nos permite crear, modificar y listar el contenido de estos archivos. Para crear la biblioteca, usamos las opciones r (insertar archivos), c (crear archivo si no existe) y s (crear el índice de símbolos necesario para el enlazador):

ar rcs calculadora.a sumar.o restar.o multiplicar.o dividir.o

Con esto, hemos creado calculadora.a, que contiene todas las funciones de nuestra calculadora.

Para verificar el contenido de la biblioteca, podemos listar los archivos que contiene con:

ar t calculadora.a

Esto mostrará los archivos objeto que están dentro de la biblioteca.

Ahora, para usar esta biblioteca en un programa que la utilice, como un archivo test.c que llama a las funciones de suma, resta, multiplicación y división, debemos compilarlo enlazando con la biblioteca estática. Suponiendo que test.c incluye el archivo de cabecera calculadora.h con las declaraciones de las funciones, compilamos así:

gcc -o test test.c calculadora.a

De esta forma, el enlazador encuentra las definiciones de las funciones en calculadora.a y las incorpora en el ejecutable test.

Este método nos permite distribuir la biblioteca como un solo archivo .a junto con sus cabeceras, facilitando su reutilización en diferentes proyectos sin necesidad de compartir todos los archivos fuente o los archivos objeto por separado.

En futuras ocasiones, podemos actualizar la biblioteca estática agregando o reemplazando archivos objeto dentro del archivo .a usando nuevamente ar con las opciones adecuadas, y también veremos cómo usar estas bibliotecas en proyectos nuevos, llevándonos simplemente el archivo .a y las cabeceras necesarias.

Así, las bibliotecas estáticas nos ayudan a modularizar nuestro código, mejorar la organización y facilitar la distribución y reutilización en proyectos en C.

Lista de reproducción
  1. 1
    Instalar CodeBlocks
    15 minutos
  2. 2
    Funciones y hola mundo
    17 minutos
  3. 3
    Variables y tipos de datos
    17 minutos
  4. 4
    Condicionales y operadores lógicos
    16 minutos
  5. 5
    Bucles
    11 minutos
  6. 6
    Punteros
    12 minutos
  7. 7
    Arrays
    14 minutos
  8. 8
    Estructuras
    12 minutos
  9. 9
    Otras construcciones de C
    9 minutos
  10. 10
    Memoria dinámica
    8 minutos
  11. 11
    El preprocesador (parte 1)
    10 minutos
  12. 12
    El preprocesador (parte 2)
    9 minutos
  13. 13
    Archivos de cabecera y múltiples .c (parte 1)
    8 minutos
  14. 14
    Archivos de cabecera y múltiples .c (parte 2)
    9 minutos
  15. 15
    C desde la línea de comandos (parte 1)
    8 minutos
  16. 16
    C desde la línea de comandos (parte 2)
    9 minutos
  17. 17
    Break y continue
    10 minutos
  18. 18
    Goto
    13 minutos
  19. 19
    Manipulación de bits
    15 minutos
  20. 20
    Máscaras de bit
    19 minutos
  21. 21
    Archivos (1): fopen y fclose
    13 minutos
  22. 22
    Archivos (2): leer con fgetc
    9 minutos
  23. 23
    Archivos (3): fseek y ftell
    11 minutos
  24. 24
    Archivos (4): leer con fgets
    9 minutos
  25. 25
    Archivos (5): fputc y fputs
    7 minutos
  26. 26
    Archivos (6): volcar en archivos con fwrite
    10 minutos
  27. 27
    Archivos (7): fread, fwrite y los arrays
    10 minutos
  28. 28
    Archivos (8): entrada estándar y salida estándar
    9 minutos
  29. 29
    Archivos (9): buffers
    14 minutos
  30. 30
    Archivos (y 10): otras funciones útiles con archivos
    5 minutos
  31. 31
    printf (1)
    18 minutos
  32. 32
    printf (parte 2)
    12 minutos
  33. 33
    scanf (parte 1)
    17 minutos
  34. 34
    scanf (parte 2)
    17 minutos
  35. 35
    fprintf, sprintf y snprintf
    8 minutos
  36. 36
    Tipos de datos opacos
    13 minutos
  37. 37
    Bibliotecas estáticas
    13 minutos
  38. 38
    Bibliotecas dinámicas
    15 minutos
  39. 39
    Más flags: i mayúscula (include), wall, werror, pedantic...
    12 minutos
  40. 40
    pkg-config
    12 minutos
  41. 41
    Make
    17 minutos
  42. 42
    GDB
    21 minutos
  43. 43
    Variables globales
    6 minutos
  44. 44
    extern
    9 minutos
  45. 45
    Funciones variádicas
    12 minutos
  46. 46
    El optimizador de GCC y la opción -O
    12 minutos
  47. 47
    Volatile
    6 minutos