Crear Bibliotecas Estáticas con GCC

Hoy estuve revisando cómo crear bibliotecas estáticas para programas C y C++, de forma de poder “empaquetar” código objeto en forma de una Biblioteca reutilizable.

(An English version of this Post can be found here.)

Crear una biblioteca estática es muy sencillo y consiste, a grandes razgos, en los siguientes dos pasos:

  1. Compilar el código fuente en código objeto.
  2. Recopilar todo el código objeto en un archivo que representa la Biblioteca.

Supongamos que tenemos un programa C sencillo como el que se presenta a continación:

/** algebra.h **/

#ifndef ALGEBRA_H
#define ALGEBRA_H

typedef struct
{
	float x, y, z;
} Vec3;

void vec3Init(Vec3* v, float x, float y, float z);

float dot(Vec3* a, Vec3* b);

#endif //ALGEBRA_H
/** algebra.c **/

#include "algebra.h"

void vec3Init(Vec3* v, float x, float y, float z)
{
	v->x = x;
	v->y = y;
	v->z = z;
}

float dot(Vec3* a, Vec3* b)
{
	return a->x * b->x + a->y * b->y + a->z * b->z;
}

Crearemos una biblioteca estática con los siguientes dos comandos:

gcc -static -c algebra.c -o algebra.o
ar -rcs libalgebra.a algebra.o

Por favor nota que hemos denominados nuestra Biblioteca “libalgebra.a”. Esto no es casualidad; El nombre debe comenzar con “lib” y terminar con “.a” para que pueda ser linkeado con gcc en un programa.

Ahora que se encuentra pronta nuestra Biblioteca, podemos redistribuirla junto con el header algebra.h para que otros programadores puedan hacer uso de ella en sus programas.

Para ilustrar esto desarrollamos un pequeño programa C que incluya el header y sea linkeado contra nuestra Biblioteca:

#include <stdio.h> /* printf */
#include "algebra.h" /* Incluimos nuestro header */

int main()
{
	Vec3 a;
	Vec3 b;
	vec3Init(&a, 1.0f, 2.0f, 3.0f);
	vec3Init(&b, 3.0f, 2.0f, 1.0f);
	printf("<a,b> = %.2f\n", dot(&a,&b));
}

Nota como hacemos un uso liberal de tipos de datos y funciones que habíamos definido en nuestra Biblioteca. Para que este programa compile, solo necesitamos que el header esté presente; Para linkearlo, debemos utilizar el flag de gcc “-l” (L minúscula, sin comillas).

gcc main.c -L. -lalgebra
$ ./a.out
<a,b> = 10.00

Dado el flag “-lalgebra”, GCC comenzará a buscar un archivo denominado “libalgebra.a” (de aquí la imporancia en el nombre utilizado para la Biblioteca). El flag “-L” le indica a GCC donde se encuentra este archivo.

Espero que les sea útil.

This entry was posted in C++, Programacion. Bookmark the permalink.

One Response to Crear Bibliotecas Estáticas con GCC

  1. jorge says:

    muy útil, muchas gracias

Comments are closed.