Todo sobre Bibliotecas Estáticas en C
Posteado el 6 de abril de 2023 por admin

Autor: Christian Varas
¿Qué es una biblioteca?
Una biblioteca es una colección de piezas de código precompiladas llamadas funciones. La biblioteca contiene funciones comunes y juntas forman un paquete llamado — una biblioteca. Las funciones son bloques de código que se reutilizan a lo largo del programa. Usar las piezas de código nuevamente en un programa ahorra tiempo. Evita que el programador reescriba el código varias veces. Para los programadores, las bibliotecas proporcionan funciones reutilizables, estructuras de datos, clases, etc.
¿Por qué y cuándo utilizar las bibliotecas?:
Las bibliotecas brindan al usuario el beneficio de usar una variedad de archivos que se pueden reutilizar en diferentes programas. Por ejemplo, si íbamos a usar las mismas funciones en diferentes programas, simplemente la escribiremos una vez y la reutilizaremos en lugar de tener cientos de copias de la misma función, una en cada programa.
Las bibliotecas tienen archivos de objetos creados por el indicador gcc «-c» y terminan en «.o» por convención. Son el resultado de la salida del compilador y contienen definiciones de funciones en forma binaria.
-Vamos a sumergirnos en un poco de código fuente C:
En la parte superior, incluimos <stdio.h>, el encabezado de entrada y salida estándar, en el que se declara la función printf.
Los archivos de encabezado, como stdio.h, contienen declaraciones de funciones y definiciones de macros para compartir entre archivos de origen. Le dicen al compilador cómo llamar a alguna funcionalidad, sin saber cómo funciona la funcionalidad.
Las bibliotecas son donde se implementa la funcionalidad real porque contienen la definición de la función. Las bibliotecas tienen dos tipos:
- Estático
- Dinámica
¿Qué es una biblioteca estática?
La forma más sencilla de usar una función de biblioteca es tener los archivos de objeto de la biblioteca vinculados directamente a su ejecutable final, al igual que con los que ha compilado usted mismo.
Cuando se vincula de esta manera, la biblioteca se denomina biblioteca estática, porque la biblioteca permanecerá sin cambios a menos que se vuelva a compilar el programa. Esta es la forma más sencilla de usar una biblioteca, ya que el resultado final es un ejecutable simple sin dependencias.
Las bibliotecas estáticas, también llamadas bibliotecas de objetos (en relación a sus componentes o módulos incluyen ficheros de este tipo), son colecciones de ficheros objeto agrupados en un único fichero, normalmente con la extensión .lib o .a., acompañados de ficheros de cabecera, normalmente .h, que contienen las declaraciones de los objetos definidos en la biblioteca. Posteriormente, durante la fase de enlace, el enlazador incluye en el ejecutable los módulos correspondientes a las funciones y clases de biblioteca que se han utilizado en la aplicación. Como resultado, dichos módulos pasan a formar parte del ejecutable, como cualquier otra función o clase que se hubiera escrito en el cuerpo de la aplicación.
«Los archivos de objetos son productos de la fase de compilación y se componen principalmente de código de máquina, pero también contienen información que permite a los enlazadores ver qué funciones y objetos globales se encuentran dentro del programa».
Cómo funcionan las bibliotecas estáticas
Recuerde los cuatro pasos de la compilación.
- Preprocesamiento: elimina comentarios y trata con # directivas
- Compilación: el código preprocesado se convierte en código ensamblador
- Ensamblaje: el código se convierte en código de máquina (ceros y unos), también conocido como código objeto
- Vinculación: produce el ejecutable
En el Paso 4, la vinculación intenta resolver los símbolos a los que se hace referencia y ubicar en qué archivo de objeto están definidos los símbolos. El código objeto de su programa se copia en el ejecutable.
Si tenemos una biblioteca estática con archivos de objetos y un índice de símbolos definidos (frente a archivos de objetos en diferentes discos), el proceso de vinculación es más rápido. Nuestro programa también es más portátil porque no tenemos que depender de las bibliotecas particulares que están en el sistema.
Cómo crear bibliotecas estáticas
- Cree un archivo de encabezado con sus prototipos de funciones e incluya el archivo de encabezado en sus archivos fuente C.
- Compile sus archivos de código fuente C sin vincularlos usando gcc-cflag.
Este comando le dice al compilador que genere archivos de objetos para todos los archivos .c en el directorio actual. El indicador -c compila sus archivos fuente C pero no los vincula.
3. Cree una biblioteca estática (archivo) usando «ar» y «ranlib».
El comando para crear una biblioteca estática es ar, que significa «archivador». El comando ar no solo crea bibliotecas estáticas (que son básicamente archivos de almacenamiento). También puede enumerar los nombres de los archivos de objetos en la biblioteca y modificar los archivos .o contenidos en la biblioteca estática. Para crear una biblioteca estática, podemos usar un comando como este:
En este comando, el indicador r garantiza que los archivos más antiguos se actualizarán reemplazándolos con nuevos archivos de objetos. El indicador c significa que la biblioteca se creará si aún no existe. Finalmente, *.o es una operación comodín para incluir todos los archivos que terminan en .o en la biblioteca estática.
Cada vez que se agregan archivos a una biblioteca, incluida la creación inicial de la biblioteca, la biblioteca debe indexarse, lo que se hace con el comando ranlib. ranlib crea un encabezado en la biblioteca con los símbolos del contenido del archivo del objeto. Esto ayuda al compilador a hacer referencia rápidamente a los símbolos. Una biblioteca grande puede tener miles de símbolos, lo que significa que un índice puede acelerar significativamente la búsqueda de referencias.
$ ranlib libholberton.a
Este paso puede o no ser necesario dependiendo de su sistema informático o su archivador (no es necesario con ar).
Si queremos ver el contenido de nuestra biblioteca, podemos usar la opción ar -t.
ar -t libholberton.a
También podemos ver los símbolos en nuestra biblioteca, usando el comando nm, que enumera el valor de símbolo de cada símbolo, el tipo de símbolo y el nombre de símbolo de los archivos de objetos.
Uso de bibliotecas estáticas
El objetivo de crear una biblioteca estática es usarla con otros programas. Si su biblioteca está en un directorio estándar, puede compilar su código de la siguiente manera:
En el comando anterior, vale la pena señalar que su código fuente, test_code.c en este caso, debe aparecer antes del indicador -l. La expresión -l combinada con holberton le dice al compilador que busque un archivo llamado libholberton.a. Por eso es importante usar el formato estándar para nombrar que describí anteriormente. Por ejemplo, si test_code.c fuera el siguiente:
Escribir y ejecutar gcc test_code.c -lholberton -o test_code generaría un archivo ejecutable llamado test_code.
Para lograr esto, el compilador busca en la biblioteca que se especifica con el indicador -l el código objeto de la función _puts. Ejecutar test_code así: ./test_code nos daría el siguiente resultado: ¡Hola mundo!.
Ahora que sabe cómo crear y usar bibliotecas estáticas, ¡espero que se divierta codificando!