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:
#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:
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:
# 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:
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
.
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 ↩︎