Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Il punto importante da comprendere è come sia possibile compilare il programma finale prog a<br />
partire dai singoli file sorgente. Le istruzioni da impartire <strong>per</strong> la compilazione sono le seguenti:<br />
$ gcc -c -o func1.o func1.c<br />
$ gcc -c -o func2.o func2.c<br />
$ gcc -o prog prog.c func1.o func2.o<br />
La prima (seconda) istruzione richiede al compilatore di compilare il file sorgente func1.c<br />
(func2.c) e di produrre il file func1.o (func2.o). Il parametro -c fornito <strong>alla</strong> linea di comando<br />
indica al compilatore di effettuare la sola compilazione ma non il linking. Senza questa opzione il<br />
compilatore segnalerebbe un errore, in quanto non è in grado di trovare la funzione main. Infatti,<br />
i due file non sono programmi completi (non contengono la funzionemain!), da cui la segnalazione<br />
di errore.<br />
La terza istruzione richiede al compilatore di compilare il file sorgente prog.c e di effettuare<br />
il linking linkando il contenuto dei file oggetto func1.o e func2.o. Se infatti si tentasse di<br />
compilate il programma prog.c senza linkare i due file, il compilatore segnalerebbe un errore in<br />
quanto non sarebbe in grado di trovare il codice relativo alle due funzioni.<br />
13.1 Il comando make<br />
Il comando make è una utility che <strong>per</strong>mette di effettuare il building automatico di programmi<br />
di grosse dimensioni, ovvero composti da molti file sorgente. In particolare, make <strong>per</strong>mette<br />
di velocizzare notevolmente il processo di ri-compilazione dell’applicazione qualora siano state<br />
effettuate modifiche soltanto ad una parte dei file sorgente.<br />
Comunemente, infatti, in progetti di grosse dimensioni, soltanto pochi file vengono modificati<br />
tra una compilazione e la successiva. In questo caso, make determina quali sono i file sorgente<br />
che devono essere ri-compilati e <strong>per</strong>mette di risparmiare il tempo richiesto da compilazioni non<br />
indispensabili.<br />
L’utilizzo di make si basa sulla scrittura di una serie di regole che specificano quali sono i<br />
file sorgente che compongono l’applicazione, quali sono i comandi che li devono elaborare, e<br />
soprattutto quali sono le loro dipendenze.<br />
Una dipendenza specifica a make quali sono i file che devono essere elaborati <strong>per</strong> ri-generare<br />
il file obiettivo. Il caso tipico è quello dei file oggetto, che dipendono dai rispettivi file sorgente.<br />
La gestione delle dipendenze <strong>per</strong>mette a make di determinare automaticamente quali sono i<br />
file che devono essere ricompilati sulla base dei tempi di creazione e modifica dei file, impostati<br />
dal sistema o<strong>per</strong>ativo ogniqualvolta si o<strong>per</strong>a su un file.<br />
La condizione che <strong>per</strong>mette a make di decidere se un file deve essere ri-generato o meno si<br />
basa sul tempo di creazione e modifica dei file, che viene aggiornato automaticamente dal sistema<br />
o<strong>per</strong>ativo in seguito ad un accesso in scrittura dei file.<br />
make rigenera il file target solo se il tempo di modifica di uno o più file dal quale il target<br />
dipende è più recente del tempo di creazione del file target.<br />
Tipicamente, make viene utilizzato <strong>per</strong> effettuare il building di programmi scritti in C e C++,<br />
ma il suo principio di funzionamento è completamente generale, e può quindi essere utilizzato<br />
<strong>per</strong> gestire un qualunque progetto software.<br />
In linea di principio, l’utilizzo di make <strong>per</strong> la generazione del file eseguibile non è strettamente<br />
necessaria. D’altra parte, il suo utilizzo si rivela sempre più indispensabile al crescere della<br />
complessità del programma, in particolare quando quest’ultimo è composto da molti file sorgente.<br />
In tal caso <strong>per</strong>mette di risparmiare molto tempo compilando soltanto i file sorgenti modificati<br />
dopo l’ultima compilazione.<br />
133