Una shared library (o tradotto letteralmente libreria condivisa), è una particolare libreria che viene caricata dinamicamente da un applicativo. Quindi, il codice della libreria non è incluso nell'applicativo stesso, rendendo quest'ultimo più piccolo in dimensioni, di conseguenza occupando meno memoria.
Scrivere una libreria non è diverso rispetto ad un programma, l'unica differenza &grave quest'ultimo
avrà un punto di accesso, ovvero la funzione main()
.
Creare l'implementazione della libreria:
planets.c
#include <stdio.h> void hello_from(int planet) { switch (planet) { case 1: printf("Ciao da Mercurio!\n"); break; case 2: printf("Ciao da Venere!\n"); break; case 3: printf("Ciao dalla Terra!\n"); break; case 4: printf("Ciao da Marte!\n"); break; case 5: printf("Ciao da Giove!\n"); break; case 6: printf("Ciao da Saturno!\n"); break; case 7: printf("Ciao da Nettuno!\n"); break; case 8: printf("Ciao da Urano!\n"); break; case 9: printf("Ciao da Plutone!\n"); break; deafault: printf("Ciao dallo spazio profondo!\n"); break; } }
Bisogna creare un file header che verrà utilizzato negli applicativi:
planets.h
#ifndef __PLANETS_H__ #define __PLANETS_H__ #define MERCURIO 1 #define VENERE 2 #define TERRA 3 #define MARTE 4 #define GIOVE 5 #define SATURNO 6 #define NETTUNO 7 #define URANO 8 #define PLUTONE 9 /* la funzione va dichiarata extern in modo da poterla usare in applicativi esterni */ extern void hello_from(int); #endif
Per compilare la libreria basta dare il seguente comando:
$ cc -fPIC -c planets.c
Si otterrà quindi il file planets.o.
Successivamente eseguire il seguente comando per ottenre la shared library:
$ cc -shared planets.o -o libplanets.so
Da notare che il file di output ha come prefisso lib, è necessario affinché il sistema operativo riesca a trovare la libreria.
I parametri usati durante la compilazione:
A questo punto, creare un file main.c
che richiamerà la funzione della libreria:
main.c
#include <stdio.h> #include "planets.h" int main(void) { hello_from(TERRA); return 0; }
Per compilare l'applicativo, bisogna specificare al linker quale libreria usare:
$ cc -L./ main.c -o planets -lplanets
Attenzione, la libreria dev'essere messa nelle directory di sistema. Altrimenti se si vuole distribuire il binario dell'applicativo con la libreria, basta eseguire questo comando:
$ cc -L./ -Wl,-rpath=./ main.c -o planets -lplanets