Differenze tra le versioni di "Creare una "Libreria condivisa" (Shared Library) .so"
(→Realizzazione pratica di una Libreria condivisa .so) |
|||
Riga 86: | Riga 86: | ||
sudo ln -sf libprimo.so.0.0 libprimo.so | sudo ln -sf libprimo.so.0.0 libprimo.so | ||
dalla quale si otterrà il file <FONT color=#B22222>libprimo.so</font> | dalla quale si otterrà il file <FONT color=#B22222>libprimo.so</font> | ||
+ | |||
+ | |||
+ | |||
+ | ==Prova della ''Libreria condivisa'' creata nell'esempio== | ||
+ | Proviamo, quindi, la nostra Libreria ''libprimo.so.0.0'', da noi appena creata, dichiarandola ed utilizzando la funzione, in essa contenuta, nel nostro applicativo Gambas. Alleghiamo al nostro applicativo Gambas il file della Libreria ''libprimo.so.0.0'' e del relativo file di collegamento simbolico ''libprimo.so'', inserendole nella cartella "Dati". Poi scriveremo il codice del nostro programma come segue, facendo in modo, per non installare permanentemente quei due file nel nostro sistema operativo, che sia il nostro programma a porre i file all'interno della directory /tmp: | ||
+ | |||
+ | <FONT color=#006400>' ''Dichiariamo la nostra Libreria da usare,'' | ||
+ | ' ''specificando in questo caso anche il percorso /tmp ove l'abbiamo copiata:''</font> | ||
+ | Library "/tmp/prova/libprimo" | ||
+ | |||
+ | |||
+ | '''Public''' Sub Form_Open() | ||
+ | |||
+ | <FONT color=#006400>' ''Se non sono già stati copiati da un precedente avvio del programma,'' | ||
+ | ' ''copiamo i due file relativi alla nostra Libreria nella directory /tmp:''</font> | ||
+ | If Not Exist("/tmp/libprimo.so.0.0") And Not Exist("/tmp/libprimo.so") Then | ||
+ | Copy "libprimo.so" To "/tmp/libprimo.so" | ||
+ | Copy "libprimo.so.0.0" To "/tmp/libprimo.so.0.0" | ||
+ | Endif | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | <FONT color=#006400>' ''Dichiariamo la funzione esterna specifica, contenuta nella "Libreria condivisa" da noi creata:''</font> | ||
+ | Private Extern fun(a As Integer) As Integer | ||
+ | |||
+ | '''Public''' Sub Button1_Click() | ||
+ | |||
+ | Dim a As Integer | ||
+ | |||
+ | <FONT color=#006400>' ''Passiamo alla funzione esterna della nostra Libreria il valore intero: 64.'' | ||
+ | ' ''Essa ci restiuirà il risultato della sua operazione (moltiplicazione del valore passato per 2):''</font> | ||
+ | a = fun(64) | ||
+ | |||
+ | Print a | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | In console avremo coerentemente: 128 |
Versione delle 19:17, 26 mag 2012
Indice
Introduzione
In Gambas possono essere richiamate con la funzione Extern le cosiddette "Librerie condivise" (Shared Library) con estensione finale .so . Esse sono librerie esterne a Gambas, scritte in C o C++, che offrono potenzialità, funzionalità e risorse non disponibili eventualmente al momento con Gambas.
Le Librerie condivise sono delle librerie che vengono caricate dai programmi al loro avvio.
E' possibile creare da sé una Liberia condivisa .so ed utilizzarla con uno o più dei nostri programmi dei Gambas, richiamandola, come sappiamo, con la funzione "Extern". Per realizzare una Liberia condivisa .so sarà necessario avere dimistichezza ed adeguata conoscenza con il linguaggio C o con il C++.
Elementi distintivi delle Librerie condivise
Riguardo alle Librerie condivise si distinguono tre tipi di nomi.
Il pprimo tipo di nome è chiamato "soname", costituito in ordine da:
- il prefisso lib;
- il nome della libreria;
- l'estensione .so;
- un punto e il numero della versione.
Esempio: libnomequalsiasi.so.0
Il secondo tipo di nome è chiamato nome reale, il quale non è altro che il file contenente il codice della libreria. Il nome reale della Liberia è costituito a sua volta in ordine da:
- il prefisso lib;
- il nome della libreria;
- l'estensione .so;
- un punto, un numero, poi un punto ed infine il numero del rilascio.
Vi è, infine, il nome che il compilatore usa, quando viene richiamata ed utilizzata una Liberia condivisa. Tale nome non è altro il soname privo di qualsiasi numero di versione. Questo file è semplicemente un collegamento simbolico al soname più recente della Libreria.
Se, dunque, per esempio il soname della Liberia condivisa è /usr/lib/libnomequalsiasi.so.1 , il file con il nome del collegamento simbolico a tale soname sarà: /usr/lib/libnomequalsiasi.so .
Pertanto riassumendo in ipotesi avremo:
- soname: libnomequalsiasi.so.1
- nome reale: libnomequalsiasi.so.1.0
- nome del collegamento simbolico: libnomequalsiasi.so
Dove salvare le Librerie condivise .so
Gli standard GNU raccomandano di insatallare tutte le Librerie nella directory: /usr/local/lib. Invece il Filesystem Hierarchy Standard (FHS) suggerisce di porre la maggior parte delle Librerie nella directory: /usr/lib, e solo quelle che non appartengono al sistema andrebbero salvate nella directory: /usr/local/lib.
Ad ogni modo, la Liberia condivisa .so, da noi creata ed utilizzata dal nostro programma Gambas, potrà essere salvata in una qualsiasi directory, e da lì richiamata dal nostro programma.
Realizzazione pratica di una Libreria condivisa .so
La creazione di una Libreria condivisa .so è semplice. Essa si articola sostanzialmente in quattro fasi, che vedremo nello specifico di seguito.
1a fase
La prima fase prevede la creazione in C o C++ dei due file che contengono il codice della/le funzione/i che sarà/nno utilizzata/e dal nostro programma Gambas. Il primo file sarà un normale file, che qui a mo' di esempio chiameremo primo.c, ed il secondo file sarà l'header del file precedente, e che chiameremo: primo.h .
Poniamo come esempio che il file primo.c sia semplicemente il seguente:
int fun(int a) { return (a * 2); }
ossia una funzione che riceve (da nostro programma Gambas chiamante) un intero, lo moltiplica per 2 e lo restiuisce alla funzione principale chiamante (cioè alla funzione della nostro programma Gambas).
Il relativo file header primo.h sarà dunque questo:
int fun(int);
2a fase
La seconda fase prevede la creazione del (o dei) file oggetto che sarà inserito nella Libreria.
Ponendosi nella directory che contiene i due file primo.c e primo.h, si userà nel terminale la seguente linea di istruzioni:
gcc -fPIC -Wall -g -c primo.c
dalla quale si otterrà il file primo.o .
3a fase
La terza fase prevede la creazione vera e propria della Libreria condivisa .so . La linea di istruzione nel terminale prevede, tra l'altro, l'indicazione del soname, del nome-reale e del file oggetto creato nella 2a fase:
gcc -g -shared -Wl,-soname,libprimo.so.0 -o libprimo.so.0.0 primo.o -lc
dalla quale si otterrà il file della nostra Libreria condivisa: libprimo.so.0.0 .
Bisogna avere attenzione a non porre alcuno spazio fra i parametri -Wl,-soname,libprimo.so.0 della precedente riga di comando.
4a fase
A questo punto si potrà, volendo, copiare/spostare il file della Libreria da noi appena creata in un'altra directory, dopo di che creeremo il file del nome di collegamento simbolico lanciando sempre da terminale la seguente riga di comando:
sudo ln -sf libprimo.so.0.0 libprimo.so
dalla quale si otterrà il file libprimo.so
Prova della Libreria condivisa creata nell'esempio
Proviamo, quindi, la nostra Libreria libprimo.so.0.0, da noi appena creata, dichiarandola ed utilizzando la funzione, in essa contenuta, nel nostro applicativo Gambas. Alleghiamo al nostro applicativo Gambas il file della Libreria libprimo.so.0.0 e del relativo file di collegamento simbolico libprimo.so, inserendole nella cartella "Dati". Poi scriveremo il codice del nostro programma come segue, facendo in modo, per non installare permanentemente quei due file nel nostro sistema operativo, che sia il nostro programma a porre i file all'interno della directory /tmp:
' Dichiariamo la nostra Libreria da usare, ' specificando in questo caso anche il percorso /tmp ove l'abbiamo copiata: Library "/tmp/prova/libprimo" Public Sub Form_Open() ' Se non sono già stati copiati da un precedente avvio del programma, ' copiamo i due file relativi alla nostra Libreria nella directory /tmp: If Not Exist("/tmp/libprimo.so.0.0") And Not Exist("/tmp/libprimo.so") Then Copy "libprimo.so" To "/tmp/libprimo.so" Copy "libprimo.so.0.0" To "/tmp/libprimo.so.0.0" Endif
End
' Dichiariamo la funzione esterna specifica, contenuta nella "Libreria condivisa" da noi creata: Private Extern fun(a As Integer) As Integer Public Sub Button1_Click() Dim a As Integer ' Passiamo alla funzione esterna della nostra Libreria il valore intero: 64. ' Essa ci restiuirà il risultato della sua operazione (moltiplicazione del valore passato per 2): a = fun(64) Print a End
In console avremo coerentemente: 128