Skip to content

Agregar bibliotecas

Para acceder a funciones de algunas bibliotecas (como las commons, pthread o readline) hace falta avisarle al linker que las vincule al momento de compilar.

Por ejemplo, si intentamos compilar este código:

c
#include <stdlib.h>
#include <stdio.h>
#include <commons/collections/list.h>

int main(int argc, char *argv[]) {
    t_list *names = list_create();
    list_add(names, "Mick");
    list_add(names, "Keith");
    list_add(names, "Ronnie");
    list_add(names, "Charlie");

    list_iterate(names, (void *)puts);

    return 0;
}

Nos aparecerá el error:

bash
undefined reference to 'list_create'
undefined reference to 'list_add'
undefined reference to 'list_add'
undefined reference to 'list_add'
undefined reference to 'list_add'
undefined reference to 'list_iterate'

Para agregar una biblioteca debemos editar la variable LIBS del archivo settings.mk del proyecto. Por ejemplo:

bash
# Libraries
LIBS=commons

Si queremos agregar más de una, cada nombre debe ir separado por espacios.

¿Qué hicimos al editar esta variable?

Editar la variable LIBS permite incluir el flag -l para linkear la biblioteca que queremos usar al momento de la compilación con gcc. Al ejecutar make veremos algo como:

bash
gcc -o bin/ejemplo.out src/main.c -lcommons

Ese -lcommons es lo que agregamos al editar LIBS.

¿Cómo funciona el flag "-l"?

Por defecto, el linker solamente va a buscar bibliotecas en las siguientes tres rutas:

/lib
/usr/lib
/usr/local/lib

Se pueden agregar más rutas pasándole a gcc el flag -L{ruta-a-biblioteca} o editando la variable de entorno[1] LIBRARY_PATH.


  1. Si te estás preguntando: "¿qué c&@$#/°s es una variable de entorno?" No te preocupes, podés encontrar una explicación simple en nuestra guía de Bash ↩︎