aboutsummaryrefslogtreecommitdiff
path: root/docs/clang/index.rhtml
blob: 71eb4ea636d77c35ba648846eb7381d4f062378d (plain)
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>), &egrave; una
  particolare libreria che viene caricata dinamicamente da un applicativo. Quindi, il codice della libreria non
  &egrave; incluso nell'applicativo stesso, rendendo quest'ultimo pi&ugrave; piccolo in dimensioni, di conseguenza
  occupando meno memoria.</p>
<p>Scrivere una libreria non &egrave; diverso rispetto ad un programma, l'unica differenza &grave quest'ultimo
  avr&agrave; 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 &lt;stdio.h&gt;

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&agrave; 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&agrave; 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>, &egrave; necessario affinch&eacute; 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&agrave; la funzione della libreria:</p>
<p><i>main.c</i></p>
<pre class="bordered">
#include &lt;stdio.h&gt;
#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>