|
|
(40 versioni intermedie di 2 utenti non mostrate) |
Riga 1: |
Riga 1: |
− | ===Introduzione===
| + | #REDIRECT [[Come creare una Libreria condivisa (Shared Library) .so]] |
− | 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 <FONT color=#B22222>''lib''</font>;
| |
− | * il <FONT color=#0000FF>nome</font> della libreria;
| |
− | * l'estensione <FONT color=#B22222>''.so''</font>;
| |
− | * un <FONT color=#0000FF>punto</font> e il <FONT color=#0000FF>numero della versione</font>.
| |
− | | |
− | | |
− | Esempio: <FONT color=#B22222>lib</font><FONT color=#0000FF>nomequalsiasi</font><FONT color=#B22222>.so</font><FONT color=#0000FF>.0</font>
| |
− | | |
− | | |
− | 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.
| |
− | | |
− | <B><FONT color=#0000FF>1<sup>a</sup> fase</font></b>
| |
− | 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);
| |
− | | |
− | | |
− | <B><FONT color=#0000FF>2<sup>a</sup> fase</font></b>
| |
− | 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 <FONT color=#B22222>''primo.o''</font> .
| |
− | | |
− | | |
− | <B><FONT color=#0000FF>3<sup>a</sup> fase</font></b>
| |
− | 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 2<sup>a</sup> 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'': <FONT color=#B22222>libprimo.so.0</font>
| |
− | | |
− | | |
− | <B><FONT color=#0000FF>4<sup>a</sup> fase</font></b>
| |
− | A questo punto si potrà, volendo, copiare/spostare il file della Libreria da noi appena creata.
| |
− | | |
− | | |
− | | |
− | | |
− | <FONT color=#FF0000><B>- Pagina in costruzione -</b></font>
| |