1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
<h1>Linguaggio di programmazione C</h1>
<h2>Indice</h2>
<ol>
<li><a href="#shared_library">Shared library</a></li>
<li><a href="#esempio_pratico">Esempio pratico</a></li>
</ol>
<h2 id="shared_library">Shared library</h2>
<p class="hyphens">Una <i>shared library</i> (o tradotto letteralmente <i>libreria condivisa</i>), è 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.</p>
<p>Scrivere una libreria non è diverso rispetto ad un programma, l'unica differenza &grave quest'ultimo
avrà un punto di accesso, ovvero la funzione <code>main()</code>.</p>
<h2 id="esempio_pratico">Esempio pratico</h2>
<p>Creare l'implementazione della libreria:</p>
<p><i>planets.c</i></p>
<pre class="bordered">
#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;
}
}
</pre>
<p>Bisogna creare un file header che verrà utilizzato negli applicativi:</p>
<p><i>planets.h</i></p>
<pre class="bordered">
#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
</pre>
<p>Per compilare la libreria basta dare il seguente comando:</p>
<pre>$ cc -fPIC -c planets.c</pre>
<p>Si otterrà quindi il file <i>planets.o</i>.</p>
<p>Successivamente eseguire il seguente comando per ottenre la shared library:</p>
<pre>$ cc -shared planets.o -o libplanets.so</pre>
<p>Da notare che il file di output ha come prefisso <i>lib</i>, è necessario affinché il sistema
operativo riesca a trovare la libreria.</p>
<p>I parametri usati durante la compilazione:</p>
<ul>
<li>-fPIC to enable position independent code</li>
<li>-shared to specify creating a shared library</li>
</ul>
<p>A questo punto, creare un file <code>main.c</code> che richiamerà la funzione della libreria:</p>
<p><i>main.c</i></p>
<pre class="bordered">
#include <stdio.h>
#include "planets.h"
int main(void)
{
hello_from(TERRA);
return 0;
}
</pre>
<p>Per compilare l'applicativo, bisogna specificare al linker quale libreria usare:</p>
<pre>$ cc -L./ main.c -o planets -lplanets</pre>
<p>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:</p>
<pre>$ cc -L./ -Wl,-rpath=./ main.c -o planets -lplanets</pre>
|