Implementación Práctica
Creación de una Biblioteca Personalizada
Desarrollo de Bibliotecas Paso a Paso
graph LR
A[Escribir Funciones] --> B[Compilar Archivos Objeto]
B --> C[Crear Biblioteca]
C --> D[Enlazar con el Programa Principal]
Estructura de Proyecto de Ejemplo
proyecto/
│
├── include/
│ └── mathutils.h
├── src/
│ ├── mathutils.c
│ └── main.c
└── Makefile
Implementación de Biblioteca Estática
Archivo de Encabezado (mathutils.h)
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
Archivo de Implementación (mathutils.c)
#include "mathutils.h"
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
Proceso de Compilación
Creación de Biblioteca Estática
## Compilar archivos objeto
gcc -c -I./include src/mathutils.c -o mathutils.o
## Crear biblioteca estática
ar rcs libmathutils.a mathutils.o
Implementación de Biblioteca Dinámica
Compilación de Biblioteca Compartida
## Compilar con código independiente de la posición
gcc -c -fPIC -I./include src/mathutils.c -o mathutils.o
## Crear biblioteca compartida
gcc -shared -o libmathutils.so mathutils.o
Estrategias de Enlace
| Tipo de Enlace |
Ejemplo de Comando |
Pros |
Contras |
| Enlace Estático |
gcc main.c -L. -lmathutils.a -o programa |
Ejecutable independiente |
Tamaño de archivo mayor |
| Enlace Dinámico |
gcc main.c -L. -lmathutils -o programa |
Ejecutable más pequeño |
Dependencia en tiempo de ejecución |
Ejemplo de Programa Principal (main.c)
#include <stdio.h>
#include "mathutils.h"
int main() {
int result = add(5, 3);
printf("5 + 3 = %d\n", result);
return 0;
}
Ejecutando el Programa
Establecer la Ruta de la Biblioteca
## Agregar el directorio actual a la ruta de la biblioteca
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
## Compilar y ejecutar
gcc main.c -L. -lmathutils -o programa
./programa
Depuración del Enlace de Bibliotecas
Comandos Útiles
## Verificar dependencias de la biblioteca
ldd programa
## Verificar la resolución de símbolos
nm -D libmathutils.so
Buenas Prácticas de LabEx
- Usar convenciones de nomenclatura consistentes
- Gestionar las versiones de las bibliotecas cuidadosamente
- Documentar las interfaces de las bibliotecas
- Manejar las condiciones de error
Errores Comunes
- Rutas de biblioteca incorrectas
- Desajustes de versiones
- Problemas de visibilidad de símbolos
- Dependencias no resueltas
Técnicas Avanzadas
Uso de pkg-config
## Simplificar la compilación de la biblioteca
gcc $(pkg-config --cflags --libs libexample) main.c -o programa
Consideraciones de Rendimiento
- Minimizar las dependencias de la biblioteca
- Usar bibliotecas ligeras
- Considerar el enlace estático para aplicaciones críticas de rendimiento